Repsonse.Transmitfile (); Может сохранить, но не может открыть - PullRequest
8 голосов
/ 20 марта 2012

Я пытаюсь отправить файл xlsx с помощью

Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/vnd-ms.excel";
Response.TransmitFile(file.FullName);
Response.End();

. Появляется диалоговое окно IE, и я могу успешно сохранить файл, а затем открыть его из папки, которая отлично работает.Но если я нажимаю «Открыть» в диалоговом окне IE, я получаю «myFile.xlsx не может быть загружен».Я нажимаю «Повторить», и открывается Excel, но появляется сообщение «Excel не может открыть файл« myFile.xlsx », потому что формат файла или расширение файла недействительно ...».
В настоящее время я запускаюсайт от VS2010 в режиме отладки.

Кто-нибудь знает, почему он позволяет сохранять, но не открывать напрямую?

Редактировать
Chrome просто загружает его.FF попытался открыть его, но выдает ошибку The file you are trying to open, 'myFile.xlsx.xls', is in a different format than specified by the file extension... Я могу выбрать, чтобы открыть его в любом случае, и он успешно открывается, но в режиме только для чтения.
Итак, здесь происходит что-то интересное.
fileName = "myFile.xlsx"

Редактировать 2
Это в IE 9. Я также пробовал octet-stream и application/vnd.openxmlformats-officedocument.spreadsheetml.sheet в качестве ContentType.

Ответы [ 5 ]

5 голосов
/ 20 марта 2012

Это потому, что ваш ContentType неверен. Используйте

Response.ContentType = "application/vnd.ms-excel";

Редактировать

если не сработало, можешь попробовать

FileStream sourceFile = new FileStream(file.FullName, FileMode.Open);
float FileSize;
FileSize = sourceFile.Length;
byte[] getContent = new byte[(int)FileSize];
sourceFile.Read(getContent, 0, (int)sourceFile.Length);
sourceFile.Close();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Length", getContent.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(getContent);
Response.Flush();
Response.End();
2 голосов
/ 29 августа 2012

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

1 голос
/ 15 августа 2012

Я столкнулся с подобной проблемой.

Оказалось, что я читал с конца потока, поэтому массив байтов не заполнялся чем-либо.

Установка позиции потока в 0 (sourceFile.Position = 0;) непосредственно перед чтением потока (sourceFile.Read (getContent, 0, (int) sourceFile.Length);) исправила это для меня.

Посмотрите, поможет ли это.

Что касается "Response.ContentType", "application / vnd.ms-excel" работал для меня.

FileStream sourceFile = new FileStream(file.FullName, FileMode.Open);
float FileSize;
FileSize = sourceFile.Length;
byte[] getContent = new byte[(int)FileSize];

sourceFile.Position = 0;

sourceFile.Read(getContent, 0, (int)sourceFile.Length);
sourceFile.Close();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Length", getContent.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(getContent);
Response.Flush();
Response.End();
0 голосов
/ 05 января 2015

Я был озадачен этой проблемой, особенно с более длинными файлами.

Оказалось, что в нашем случае использование заголовка Content-Length устранило проблему.Как только содержимое становится больше определенной длины, вы получаете эту проблему.

Пример (где tempsbldr является StringBuilder):

  Response.AddHeader("Content-Length",tempsbldr.Length.ToString());
0 голосов
/ 20 марта 2012

По стечению обстоятельств я нахожусь в середине чего-то похожего ...

Тип MIME для xlsx - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, см. этот вопрос .

...