#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");
Другие вещи, которые нужно проверить
- Ответ.В начале буферизуйте значение true
- Ответ.вначале очистить
- Используйте response.binarywrite вместо файла записи
- Сброс ответа в конце
- Убедитесь, что в 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 — вы хотите сказать, что у вас это работает с этими двумя строками?