Принудительная загрузка PDF в ASP.Сеть с IE

#asp.net #internet-explorer #firefox #pdf #google-chrome

#asp.net #internet-Explorer #firefox #PDF #google-Chrome

Вопрос:

Итак, я использую немного кода для принудительной загрузки на моем ASP.Net проект на основе. Этот фрагмент кода работает в Firefox и Chrome, но по какой-то странной причине не в IE. Что еще более странно, изначально он работал во всех трех и недавно перестал работать в IE. Ниже приведен код, который я использовал, пожалуйста, дайте мне знать, если потребуется внести какие-либо изменения или в чем может быть проблема с with.

  string path = MapPath(fname);
    string name = Path.GetFileName(path);
    string ext = Path.GetExtension(path);
    string type = "Application/pdf";
    Response.AppendHeader("content-disposition","attachment; filename="   path);
    Response.WriteFile(path);
    Response.End();  
  

Более подробная информация
Вот обновленный код, который по-прежнему не работает для IE.

  string path = MapPath(fname);
    string name = Path.GetFileName(path);
    string ext = Path.GetExtension(path);
    string type = "Application/pdf";
    Response.ClearHeaders();
    Response.ClearContent();
    Response.ContentType = type;
    Response.AddHeader("content-disposition","attachment; filename="   path);
    Response.WriteFile(path);
    Response.End();  
  

Комментарии:

1. Вы должны использовать System.Net.Mime. ContentDisposition для создания заголовка, если вы используете пользовательские имена файлов, — это позволит корректно обрабатывать пробелы в именах файлов и символы, отличные от ASCII. Или, если это MVC, вы можете просто использовать return File(...); .

Ответ №1:

Вероятно, вам следует попытаться установить тип mime на «application / octet-stream». Если вы не хотите, чтобы определенный обработчик отвечал на mime-тип.

Комментарии:

1. Именно это я и делаю в таком случае.

2. Я использовал их оба, и они дают одинаковые результаты

Ответ №2:

Должен ли этот код

 Ответ.AddHeader("расположение содержимого","вложение; имя файла ="   путь);

быть изменен как

 Ответ.AddHeader("расположение содержимого","вложение; filename="   name   "."   ext);

или

 Ответ.AddHeader("расположение содержимого","вложение; filename="   name   ".pdf");

Другие вещи, которые нужно проверить

  1. Ответ.В начале буферизуйте значение true
  2. Ответ.вначале очистить
  3. Используйте response.binarywrite вместо файла записи
  4. Сброс ответа в конце
  5. Убедитесь, что в response.stream не записано никаких символов HTML или пробела, отличных от двоичной записи.

Комментарии:

1. Я все еще думаю, что вам следует использовать класс ContentDispositon, чтобы имя было правильно экранировано. Но почему BinaryWrite не записывает файл? Не похоже, что у него есть файл в памяти.

2. Почему это должно быть медленнее? Я ожидал бы, что это будет по крайней мере так же быстро, как загрузка в память и бинарная запись его самостоятельно. Но, возможно, он хочет вместо этого TransmitFile .

3. Файл pdf содержит как двоичное, так и текстовое содержимое. Все это должно быть записано в двоичном формате. С помощью writefile код исправления ошибок браузера попытается захватить файл в виде текста, а затем обнаружит, что в него поступает двоичный файл. С Binarywrite нет путаницы, особенно с безмозглыми браузерами, такими как IE. Есть несколько тестов, выполненных с использованием обоих методов, и binarywrite оказывается быстрее. Но, как вы говорите, transmitfile — лучший вариант.

Ответ №3:

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

Ответ №4:

Добавление следующих двух строк вверху исправило это для меня:

 Response.ClearContent();
Response.ClearHeaders();
  

Комментарии:

1. строковый путь = MapPath(fname); строковое имя = Path.GetFileName(путь); строковый ext = Path.getExtension(путь); строковый тип = «Приложение / pdf»; Ответ. ClearHeaders(); Ответ. ClearContent(); Ответ. ContentType = тип; Ответ. AddHeader(«расположение содержимого»,»вложение; имя файла =» путь); Ответ. Файл записи (путь); Response.End();

2. @Craig — вы хотите сказать, что у вас это работает с этими двумя строками?