Можно ли использовать" встроенный "контент-диспозицию с" приложением / октет-потоком"?
Мне нужно, чтобы браузер открывал типы файлов, которые он понимает непосредственно в браузере (т. е. без диалогового окна "открыть/Сохранить/Отменить".
Вот мой код, который в настоящее время отлично работает!...за исключением того, что каждый файл открывает диалоговое окно и не открывает файл напрямую:
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 ответ:
Вам не нужно создавать обработчик для каждого типа файла. Вы просто измените строку:
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 на основе расширения файла, которое вы знаете, или это может означать хранение явного типа контента отдельно в виде метаданных вместе с информацией о файле.