FileResult возвращает поврежденный файл
Я создаю простое действие контроллера в ASP.NET MVC 2 (в рамках.NET 4.0), которое будет изменять размеры файлов.
У меня есть такой контроллер (я его немного урезал):
public ActionResult GetFile(int fileId, string fileSource) {
FileInfo file = repo.FindFileById(fileId);
//do some resizing
string mimeType = string.Empty;
switch(file.Extension) {
case ".jpg":
mimeType = "image/jpg";
break;
//some more stuff
default:
mimeType = "text/png";
break;
}
return File(file.FullName, mimeType);
}
В файловой системе это хорошо сохраняет, я могу просмотреть измененный размер файла, но в браузере файл не отображается.
Я использовал Чарльза для проверки ответа, и он возвращается с HTTP-статусом 200, но изображение не видно.
Если я пытаюсь сохранить изображение и просмотреть его, средство просмотра изображений Windows говорит, что оно повреждено.
Я также попытался с ZIP (без изменения размера;)), и он возвращает поврежденный файл ZIP.
Я уверен, что я просто делаю что-то не так, но я не могу это понять.
редактировать
Я тестировал и в Cassini, и в IIS 7.5 (Windows 7) и устранял проблему в обоих случаях.
4 ответа
Я бы порекомендовал вам приступить к ликвидации. Начните с простого действия и рабочего изображения JPEG:
public ActionResult Index()
{
return File("test.jpg", "image/jpeg");
}
Если это не работает, возможно, у вас возникла другая проблема (вы также можете попробовать очистить кеш браузера). Если это работает, замените test.jpg
на тот, который у вас есть, но до изменения размера и т. д., пока не найдете проблему.
Оказывается, что проблема вызвана модулем сжатия Http, который работает на сайте, он пытается преобразовать отклик изображения, повреждая изображение.
Правильный тип пантомимы для jpeg: image/jpeg, а не image/jpg. Это вызовет проблемы.
Вы также должны опубликовать свой код для изменения размера, так как это, вероятно, является причиной вашего искажения. Что произойдет, если вы просто прочитаете штраф и выпишете его обратно?