【问题标题】:Downloading files from Servlets - Chrome warning + how to redirect user after download?从 Servlets 下载文件 - Chrome 警告 + 下载后如何重定向用户?
【发布时间】:2013-11-04 23:22:39
【问题描述】:

我有一个带有下载文件链接的简单表格..

一切似乎都运行良好,当我点击下载时,文件会在硬盘上找到并提供给用户。

我的问题是,当我检查 chrome 时,我看到:

Resource interpreted as Document but transferred with MIME type application/octet-stream: "http://localhost:8080/fus-app/myUploadedFiles".

为什么会这样说?

我的相关代码是:

    httpServletResponse.setContentType("application/octet-stream");
    httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"" + fileNameOnSystem + "\"");

还有一个额外的问题:

文件下载后,用户仍然看到带有表格的页面,但我想重定向到不同的页面。我怎样才能做到这一点?

 response.sendRiderect() 

似乎不起作用。

编辑:这就是我向用户提供下载链接的方式:

<form method="post" action="<%= request.getServletContext().getContextPath() +"/myUploadedFiles" %>">
    <input type="hidden" name="fileNameOnSystem" value="<%= rset.getString("fileNameOnSystem") %>" />
    <button type="submit" class="btn btn-default" />Download File </button>
</form>

【问题讨论】:

    标签: java jakarta-ee servlets


    【解决方案1】:

    尝试在下载链接中指定 HTML5 下载属性:

    <a href='http://example.com/archive.zip' download>Export</a>
    

    https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

    至于重定向,这里不是好消息Is it possible to forward or redirect from a servlet filter after the response has been committed? ...

    HttpServletResponse 的“已提交”状态实际上是一种 说明响应标头是否已写入 底层套接字。一个“承诺”的回应(至少)是第一个 行写。由于响应的第一行包含状态 代码,因此您无法更改已提交的状态代码 响应...这意味着将状态更改为 3xx 为时已晚 做一个重定向。同样,您不能进行本地转发,因为 您已经开始发送响应了。

    因此,在您发送文件(这是一个已提交的响应)之后,您将无法对响应执行更多操作。但是,您可以先将它们转发到另一个页面,然后显示一条消息并最终触发下载。

    找到这个例子:

    <html>  
    <head>  
    <meta http-equiv="refresh" content="5;url=http://server.com/file.zip">  
    </head>  
    <body>  
    Thank you for downloading file.zip!  
    </body>  
    </html> 
    

    【讨论】:

    • 感谢您的回答,我已经编辑了我的问题。实际上该文件位于驱动器中的某个位置,因此我必须从 servlet 提供该文件,我无法直接链接到该文件。
    • 系统上的文件名类似于:test1234.pdf,我知道它在哪个目录中(如 C:\appuser\test1234.pdf ),所以我可以提供文件。所以我只能给 servlet 提供某种参数,然后我就放弃了文件。
    • 您应该能够只提供 servlet 处理的 URL。客户端不知道它是否是实际文件,或者您只是在生成随机位。因此,如果您的 servlet 处理 woogie.com/somefile,您仍然可以将:&lt;a href='http://woogie.com/myfile' download&gt;Export&lt;/a&gt; 放在您的网页上。
    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2021-11-02
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多