2014-09-07 17 views
5

Mam projekt MVC, w którym chciałbym, aby użytkownik mógł pobrać plik Excela za pomocą kliknięcia przycisku. Mam ścieżkę do pliku i nie mogę znaleźć odpowiedzi za pomocą google.Jak pobrać plik do klienta z serwera?

Chciałbym być w stanie to zrobić za pomocą prostego przycisku mam na mojej stronie cshtml:

<button>Button 1</button> 

Jak mogę to zrobić? Każda pomoc jest bardzo cenna!

Odpowiedz

11

Jeśli plik nie znajduje się wewnątrz folderów aplikacji i nie jest dostępny bezpośrednio z klienta, możliwe jest działanie kontrolera, które przesyła zawartość pliku do klienta. Można to osiągnąć poprzez zwrot FileResult z akcji kontrolera stosując metodę File:

public ActionResult Download() 
{ 
    string file = @"c:\someFolder\foo.xlsx"; 
    string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    return File(file, controntType, Path.GetFileName(file)); 
} 

a następnie zastąpić przycisk z kotwicą, wskazując na to działanie kontrolera:

@Html.ActionLink("Button 1", "Download", "SomeController") 

Alternatywnie do korzystania kotwicę możesz również użyć formularza html:

@using (Html.BeginForm("Download", "SomeController", FormMethod.Post)) 
{ 
    <button type="submit">Button 1</button> 
} 

Jeśli plik znajduje się w jakimś niedostępnym folderze klienta aplikacji, takich jak App_Data można użyć metody MapPath skonstruować pełną fizyczną ścieżkę dostępu do tego pliku za pomocą ścieżki względnej:

string file = HostingEnvironment.MapPath("~/App_Data/foo.xlsx"); 
+0

co czy plik znajduje się na innym serwerze? powiedzmy, że nazwa serwera to "VUP-1"? i powiedzmy, że ścieżka to "c: \ someFolder \ foo.xlsx" -> na serwerze VUP-1 –

2

HTML:

<div>@Html.ActionLink("UI Text", "function_name", "Contoller_name", new { parameterName = parameter_value },null) </div> 

Kontroler:

public FileResult download(string filename) { 
     string path = ""; 
     var content_type = ""; 
     path = Path.Combine("D:\file1", filename); 

     if (filename.Contains(".pdf")) 
     { 
      content_type = "application/pdf"; 
     } 
     return File(path, content_type, filename); 
}