Chrome 开发工具将 Grails 应用程序中动态生成的文件的下载状态显示为已取消

Posted

技术标签:

【中文标题】Chrome 开发工具将 Grails 应用程序中动态生成的文件的下载状态显示为已取消【英文标题】:Chrome dev tools shows download status as canceled for dynamically generated file in Grails app 【发布时间】:2013-02-03 17:41:40 【问题描述】:

我需要从请求中发送的一些参数生成 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)中,我尝试了多种下载文件的方法:

    将隐藏表单附加到文档(使用 action = “downloadFile”控制器方法)并调用 form.submit() 将隐藏的 iframe 附加到文档(使用 src = "downloadFile" 控制器方法) 将 Ajax.request 与 isUpload: true 和 form: hiddenFormElement 一起使用

三个都成功下载了文件,但 Chrome 仍然显示状态为取消。

我在 Chrome 控制台中注意到了这个警告:

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

谢谢!

【问题讨论】:

【参考方案1】:

添加这一行

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

之后

response.outputStream << outArray

【讨论】:

法比奥感谢您的回复。我试过这个,但它仍然给我同样的错误。唯一的区别是我在 response.outputStream 【参考方案2】:

Adman 抱歉忘记刷新,下面的代码在我的 chrome 上运行

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")

【讨论】:

以上是关于Chrome 开发工具将 Grails 应用程序中动态生成的文件的下载状态显示为已取消的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Fetch API 获取 JSON,但可以使用 JQuery

将 Grails 与现有的 Web 应用程序集成

grails:将 SQL 转换为域类

声纳的 Groovy/Grails 插件

将Oracle数据库连接到Grails 3

具有并发会话的 grails 3