2011-01-18 18 views
6

Pierwsza część pytania:asp.net mvc FileStreamResult

Mam informacje w bazie danych i chcę dostać od db i zapisać go jako .txt pliku do klienta.

Zrobiłem to z regularnym asp.net. ale w MTV jeszcze nie. Moje informacje nie są obrazem. Ta informacja o narodami

Patrzyłem na This site

Druga część pytania:

chcę pobrać plik do klienta. Nie ma problemu z pobieraniem jednego pliku, ale chcę pobrać 3 pliki naraz z jednym żądaniem. Ale nie można tego zrobić. Postanowiłem więc stworzyć plik zip i wygenerować link. Gdy użytkownik kliknie link, zostanie pobrany do użytkownika.

Co myślisz? Czy to dobrze zrobić w ten sposób?

Trzecia część pytania: (nowy)

Jak mogę usunąć stare pliki .zip z katalogu po sukces pobrać? lub w inny sposób. Powiedzmy, że z usługą, która będzie działać na serwerze.

+0

Dziękuję, kto zmienił moje pytanie – AEMLoviji

Odpowiedz

12

Można mieć następujące działania kontrolera, który będzie pobierał informacje z bazy danych i zapisać go do strumienia odpowiedzi umożliwiając klientowi pobranie go:

public ActionResult Download() 
{ 
    string info = Repository.GetInfoFromDatabase(); 
    byte[] data = Encoding.UTF8.GetBytes(info); 
    return File(data, "text/plain", "foo.txt"); 
} 

iw widoku podać link do tej akcji :

<%= Html.ActionLink("Downoad file", "Download") %> 
+0

tak, sprawdziłem to. Ale Encoding.UTF8.GetBytes() przyjmuje ciąg jako ciąg. ale mój wynik z repozytorium.GetInfoFromDatabase(); nie będzie prostym łańcuchem. może to być info jako FirstName, LastName, Patronymic ... – AEMLoviji

+0

@AEMLoviji, w tym przypadku musisz użyć warstwy usługi. Ta warstwa usług wywoła metodę repozytorium i wygeneruje ciąg znaków lub dowolny format, w którym chcesz wysłać informacje do klienta z modelu. Następnie kontroler wywoła metodę warstwy usługi, która zwróci ciąg i strumień do klienta. –

+0

tak, to jest proste, ale nie jest to dobry sposób. Chyba tak. czy istnieje inny sposób konwersji IEnumreable na byte []? – AEMLoviji

3

Można usunąć zwrócony plik tymczasowy za pomocą filtru akcji w ten sposób. Następnie zastosuj atrybut do swojej metody działania MVC.

public class DeleteTempFileResultFilter : ActionFilterAttribute 
    { 
     public override void OnResultExecuted(ResultExecutedContext filterContext) 
     { 
      string fileName = ((FilePathResult)filterContext.Result).FileName; 

      filterContext.HttpContext.Response.Flush(); 
      filterContext.HttpContext.Response.End(); 

      System.IO.File.Delete(fileName); 
     } 
    }