8

を使用して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 にあります。ContentType として
も試しました。octet-streamapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

4

5 に答える 5

5

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();
于 2012-03-20T15:53:03.007 に答える
2

私はかつて同じ問題を抱えていましたが、アプリケーション サーバー (この場合は IIS) から送信されるキャッシュ命令を修正することで解決しました。場合によっては、アプリケーション レベルでヘッダーを追加して、HTTPS 接続などの特定の条件でファイルが保存されないようにすることがあります。矛盾する指示を入れていないことを確認してください。

于 2012-08-28T20:29:58.810 に答える
1

同様の問題に遭遇しました。

ストリームの最後から読んでいたことが判明したため、バイト配列には何も入力されていませんでした。

ストリーム (sourceFile.Read(getContent, 0, (int)sourceFile.Length);) を読み取る直前にストリーム位置を 0 (sourceFile.Position=0;) に設定すると、修正されました。

それが役立つかどうかを確認してください。

「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();
于 2012-08-15T06:38:41.560 に答える
0

偶然にも、私は似たようなことの真っ只中にいます...

xlsx に使用する MIME タイプは、この質問application/vnd.openxmlformats-officedocument.spreadsheetml.sheetを参照してください。

于 2012-03-20T16:03:52.093 に答える