Я работаю над веб-приложением и потребностью передать различные файлы потоком. Я могу сделать pdfs, изображения и более старые документы Office. Однако, когда я пытаюсь сделать с документами 2007 года, это повреждается. Вот мой код:
Response.Buffer = true;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
switch (FileExtension.ToLower())
{
case "pdf":
Response.ContentType = "application/pdf";
break;
case "doc":
Response.ContentType = "application/msword";
break;
case "docx":
Response.ContentType = "application/vnd.ms-word.document.12";
break;
case "xls":
Response.ContentType = "application/vnd.ms-excel";
break;
case "xlsx":
Response.ContentType = "application/vnd.ms-excel.12";
break;
default:
Response.ContentType = "image/jpeg";
break;
}
Response.BinaryWrite(buffer);
Ошибка, которую я получаю:
An invalid character was found in text content. Error processing resource 'http://DomainName/GetFile.aspx... PK
Какие-либо предложения?
Согласно краткому поиску в Интернете, правильные типы пантомимы для word и excel:
application/vnd.openxmlformats-officedocument.wordprocessingml.document
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
http://www.bram.us/2007/ 05/25 / office-2007-mime-types-for-iis /
Edit:
Следующий упрощенный пример мне подходит. Он отличается от вашего тем, что использует общий обработчик вместо веб-формы (что в любом случае больше подходит для чего-то вроде этого).
Чтобы проверить это, убедитесь, что в папке верхнего уровня приложения есть файл Excel 2007 с именем Book1.xlsx.
DownloadSpreadsheet.ashx:
<%@ WebHandler Language="C#" Class="DownloadSpreadsheetHandler" %>
using System;
using System.Web;
using System.IO;
public class DownloadSpreadsheetHandler: IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
string path = context.Server.MapPath("~/Book1.xlsx");
using (FileStream spreadsheet = File.OpenRead(path))
{
CopyStream(spreadsheet, context.Response.OutputStream);
}
}
public bool IsReusable {
get {
return false;
}
}
private static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
while (true)
{
int read = input.Read(buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write(buffer, 0, read);
}
}
}
Для файлов формата CSV, для открытия которые мы хотим использовать Excel, мы используем: Response.ContentType = "application/msexcel";
Возможно, нам это сойзет с рук, потому что это не настоящий xls-файл.