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. Это вызовет проблемы.

Вы также должны опубликовать свой код для изменения размера, так как это, вероятно, является причиной вашего искажения. Что произойдет, если вы просто прочитаете штраф и выпишете его обратно?

Попробуйте использовать FileResult вместо ActionResult

Другие вопросы по тегам