Можно ли использовать" встроенный "контент-диспозицию с" приложением / октет-потоком"?


Мне нужно, чтобы браузер открывал типы файлов, которые он понимает непосредственно в браузере (т. е. без диалогового окна "открыть/Сохранить/Отменить".

Вот мой код, который в настоящее время отлично работает!...за исключением того, что каждый файл открывает диалоговое окно и не открывает файл напрямую:

string filePath = Path.Combine(WebConfigurationManager.AppSettings["NewsAttachmentPath"], context.Request.QueryString["FileName"]);
byte[] bytes = System.IO.File.ReadAllBytes(filePath);
context.Response.Clear();
context.Response.ContentType = "application/octet-stream";
context.Response.Cache.SetCacheability(HttpCacheability.Private);
context.Response.Expires = -1;
context.Response.Buffer = true;
context.Response.AddHeader("Content-Disposition", string.Format("{0};FileName="{1}"", "inline", context.Request.QueryString["FileName"]));
context.Response.BinaryWrite(bytes);
context.Response.End();

Как вы можете видеть, даже когда я изменяю расположение содержимого на "inline", оно все равно запрашивает загрузку. Это с файлами, которые, как я знаю, понимает мой браузер. Другими словами, я могу перейти на какой-нибудь случайный сайт и нажать кнопку PDF, и он откроется в браузере. Мой сайт заставит меня сохранить его, чтобы просмотреть его.

Упреждающий ответ на вопрос " почему вы хотите использовать application / octet-stream?- Потому что я не хочу создавать обработчик для каждого отдельного типа файлов. Если это ошибка, пожалуйста, дайте мне знать.

1 2

1 ответ:

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

context.Response.ContentType = "application/octet-stream";

Быть:

string contentType = //your logic here, possibly many lines in a separate method
context.Response.ContentType = contentType;

Но нет: вы не можете "встроить" приложение / октет-поток. Это означает: "вот несколько байтов, но я не знаю, что это такое". Браузер не может сделать много с этим, кроме как сохранить его где-то, следовательно, запрос на загрузку. Однако вы можете использовать content-disposition, чтобы предложить имя файла.

Браузер не работает с расширениями файлов - он работает на тип содержимого. Итак: вы должны сообщить правильный тип контента в своем ответе. Это может означать написание switch / lookup на основе расширения файла, которое вы знаете, или это может означать хранение явного типа контента отдельно в виде метаданных вместе с информацией о файле.