2009-05-14 11 views
14

Mam proste kontroler która zwraca zdjęcia:Różnica między FileStreamResult i FilePathResult?

public class ImageController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(CacheProfile = "StationeryImageCache")] 
    public FileResult Show(int customerId, string imageName) 
    { 
     try 
     { 
      var path = string.Concat(Config.ImageDir, customerId, @"\", imageName); 
      return new FileStreamResult(new FileStream(path, FileMode.Open), "image/jpeg"); 
     } 
     catch(System.IO.FileNotFoundException ex) 
     { 
      throw new MissingImageException(imageName); 
     } 
    } 
} 

Mój menedżer zauważył FileStreamResult podczas przeglądu kodu i wymienić muszę zamienić go z:

return new FilePathResult(path, "image/jpeg"); 

to sens dla mnie tak zrobiłem to. Ale po kilku dniach jeden z naszych pozostałych deweloperów zgłosił, że niektóre obrazy, które wracałem, wróciły zepsute. W szczególności było wiele obrazów, które zostały odcięte w pewnym momencie. Rozmiar obrazu był prawidłowy, ale dolne 25% - 40% obrazu zostało po prostu usunięte.

Podczas przeglądania oryginalnego obrazu w systemie plików nie było w tym nic złego. Wrzuciłem obraz do przeglądarki i wszystko wyglądało dobrze. Ale mój kontroler tylko zwrócił część obrazu. Co gorsza, to tylko niektóre obrazy były problemami ... około 30% z nich ... chociaż nie jestem w stanie znaleźć żadnych szczególnych różnic między tymi, którzy pracują, a tymi, którzy tego nie robią.

Podczas próby debugowania odwróciłem wynik działania z powrotem do FileStreamResult i nagle wszystko znów działało.

Czy ktoś zna wyjaśnienie tego?

Odpowiedz

13

Wygląda na to, że plik HttpResponse.TransmitFile używany w FilePathResult miał lub miał kilka problemów. Może zależeć od wersji systemu Windows, na którym działa serwer, zgodnie z tym hotfix. Jeśli szukasz w Google czegoś takiego jak "response.TransmitFile error", otrzymujesz wiele błędów.

Chyba powinieneś użyć swojego oryginalnego kodu!

+0

Nice find! Już miałem zacząć szukać źródła, ale nie zauważyłbym tego nawet, gdybym to zrobił. –