Как я могу предоставить пользователям диалог сохранения файла при нажатии на ссылку на изображение? - PullRequest
0 голосов
/ 04 ноября 2011

Я немного осмотрелся, и похоже, что решение проблемы заключается в изменении заголовка содержимого файла, чтобы он не рассматривался как обычное изображение.

Это все хорошо, и я попытался написать обработчик изображения для этого. Проблема в том, что изображения, которые я использую, бывают разных форматов. Я буду использовать jpg / png / tiff / eps.

Мой план состоял в том, чтобы использовать класс Bitmap для открытия файла, а затем сохранить его в выходном потоке, используя:

Bitmap bmap = new Bitmap(context.Server.MapPath(imagePath));
bmap.Save(context.Response.OutputStream, ImageFormat.<Format goes here>);

Проблема в том, что .Net, похоже, не поддерживает расширение eps, так как мне иметь дело с этими файлами. Правильный ли я подход?

Спасибо

EDIT:

Я действительно использовал комбинацию обоих ваших предложений, чтобы придумать:

// determine what type of file to send back   
switch (Path.GetExtension(imagePath))
{
    case ".png":
        context.Response.ContentType = "image/png";
        context.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".png");
        break;
    case ".jpg":
        context.Response.ContentType = "image/jpeg";
        context.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".jpg");
        break;
    case ".tiff":
        context.Response.ContentType = "image/tiff";
        context.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".tif");
        break;
    case ".eps":
        context.Response.ContentType = "image/postscript";
        context.Response.AddHeader("content-disposition", "attachment; filename=" + fileName + ".eps");
        break;
}

context.Response.WriteFile(context.Server.MapPath(imagePath));
context.Response.Flush();

Кажется, что добился цели - спасибо обоим за вашу помощь!

Ответы [ 2 ]

4 голосов
/ 04 ноября 2011

Вы слышали о заголовке контента?Это позволяет вам сказать браузеру спрашивать пользователя, что делать с файлом, а не пытаться обрабатывать его самостоятельно.Я не думаю, что это является частью спецификации HTTP, но она задокументирована IETF под RFC 2183 .

. * * * * * * * * * * * * * * * *добавить необходимые заголовки ответа.

2 голосов
/ 04 ноября 2011

Я бы предложил использовать метод WriteFile, доступный в context.Response, с последующим вызовом Flush, т.е.:

Response.WriteFile(context.Server.MapPath(imagePath));
Response.Flush();

Надеюсь, это поможет.

...