2

リクエストで送信されたいくつかのパラメーターから Excel ファイルを生成する必要があります。すべて正常に動作しているように見えますが、Chrome の開発ツールを開くと、ダウンロードが赤でマークされ、ステータス列に「(キャンセル)」と表示されます。ダウンロードしたファイルを問題なく開くことができます。

また、net-internals を使用して詳細情報を記録しましたが、何を探しているのか正確にはわかりません。

最終的なログ メッセージは次のように表示されます。

[st=52] DOWNLOAD_ITEM_COMPLETING
                       --> bytes_so_far = "6656"
                       --> final_hash = "BLAHBLAHBLAH....."
[st=80]    DOWNLOAD_FILE_DETACHED
[st=80]    DOWNLOAD_FILE_CLOSED
[st=93]    DOWNLOAD_ITEM_FINISHED
                       --> auto_opened = "no"
[st=94] -DOWNLOAD_ITEM_ACTIVE

ファイルを生成するための Grails / apache poi コードは非常に単純です。

def downloadFile() {
    def cellData = params.data

    response.setContentType("application/vnd.ms-excel")
    response.setHeader('Content-Disposition', 'attachment;filename=myfile.xls')
    response.setStatus(HttpServletResponse.SC_OK)

    Workbook wb = new HSSFWorkbook()
    Sheet sheet = wb.createSheet("My Sheet")
    Row row = sheet.createRow(0)
    row.createCell(0).setCellValue(cellData)

    ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
    wb.write(outByteStream);
    byte [] outArray = outByteStream.toByteArray();

    response.setContentLength(outArray.length);
    response.outputStream << outArray
}

最後に、私たちの Javascript アプリ (ExtJS 4 を使用しています) で、ファイルをダウンロードする複数の方法を試しました。

  1. 非表示のフォームをドキュメントに追加し (action = "downloadFile" コントローラー メソッドを使用)、form.submit() を呼び出します。
  2. 非表示の iframe をドキュメントに追加する (src = "downloadFile" コントローラー メソッドを使用)
  3. isUpload: true および form: hiddenFormElement での Ajax.request の使用

3 つすべてがファイルを正常にダウンロードしますが、Chrome ではステータスがキャンセルされたままです。

Chrome コンソールで次の警告に気付きました。

Resource interpreted as Document but transferred with MIME type application/vnd.ms-excel

ありがとう!

4

2 に答える 2

0

この行を追加

render(text: outArray, contentType: "text/xls", encoding: "UTF-8")

この後

response.outputStream << outArray
于 2013-03-24T20:46:15.953 に答える
0

Adman 申し訳ありませんが、フラッシュするのを忘れました。以下のコードは私のクロムで動作しています

def xls() {
def cellData = params.data

response.setContentType("application/vnd.ms-excel")
response.setHeader('Content-Disposition', 'attachment;filename=myfile.xls')
response.setStatus(HttpServletResponse.SC_OK)

Workbook wb = new HSSFWorkbook()
Sheet sheet = wb.createSheet("My Sheet")
Row row = sheet.createRow(0)
row.createCell(0).setCellValue(cellData)

ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
wb.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();

response.setContentLength(outArray.length);
response.outputStream << outArray
response.outputStream.flush
render(text: outArray, contentType: "application/vnd.ms-excel", encoding: "UTF-8")

}

于 2013-03-26T13:09:54.720 に答える