私はWebアプリに取り組んでおり、さまざまなファイルをストリーミングする必要があります。 PDF、画像、古い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);
私が得るエラーは次のとおりです。
テキストコンテンツに無効な文字が見つかりました。リソースの処理中にエラーが発生しました 'http://DomainName/GetFile.aspx ... PK
助言がありますか?
簡単なウェブ検索によると、WordとExcelの正しいmimeタイプは次のとおりです。
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/
編集:
次の簡略化されたサンプルは私のために働きます。 Webフォームの代わりにジェネリックハンドラーを使用するという点であなたのものとは異なります(とにかくこのようなものに適しています)。
テストするには、アプリケーションの最上位フォルダーにBook1.xlsxという名前のExcel2007ファイルがあることを確認します。
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);
}
}
}
.doc
application/msword
.dot
application/msword
.docx
application/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotx
application/vnd.openxmlformats-officedocument.wordprocessingml.template
.docm
application/vnd.ms-Word.document.macroEnabled.12
.dotm
application/vnd.ms-Word.template.macroEnabled.12
.xls
application/vnd.ms-Excel
.xlt
application/vnd.ms-Excel
.xla
application/vnd.ms-Excel
.xlsx
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltx
application/vnd.openxmlformats-officedocument.spreadsheetml.template
.xlsm
application/vnd.ms-Excel.sheet.macroEnabled.12
.xltm
application/vnd.ms-Excel.template.macroEnabled.12
.xlam
application/vnd.ms-Excel.addin.macroEnabled.12
.xlsb
application/vnd.ms-Excel.sheet.binary.macroEnabled.12
.ppt
application/vnd.ms-PowerPoint
.pot
application/vnd.ms-PowerPoint
.pps
application/vnd.ms-PowerPoint
.ppa
application/vnd.ms-PowerPoint
.pptx
application/vnd.openxmlformats-officedocument.presentationml.presentation
.potx
application/vnd.openxmlformats-officedocument.presentationml.template
.ppsx
application/vnd.openxmlformats-officedocument.presentationml.slideshow
.ppam
application/vnd.ms-PowerPoint.addin.macroEnabled.12
.pptm
application/vnd.ms-PowerPoint.presentation.macroEnabled.12
.potm
application/vnd.ms-PowerPoint.presentation.macroEnabled.12
.ppsm
application/vnd.ms-PowerPoint.slideshow.macroEnabled.12
Excelを使用して開くcsv形式のファイルには、次のものを使用しています。Response.ContentType = "application/msexcel";
ただし、これは真のxlsファイルではないため、おそらくこれを回避できます。