From the tests done I get this error: java.lang.IllegalStateException: getWriter() has Already Been Called for this response.
换句话说,你试图图像的二进制数据与HTML输出的字符数据混合,或者你想这样做的JSP,而不是一个Servlet。这确实不起作用。您需要发送图像或该HTML页面专门回应完全分开的请求。
在你的JSP/HTML页面只是有一个链接到图像,像这样:
<a href="imageservlet/filename.gif">click to download image</a>
然后,在一个servlet监听的/imageservlet/*
的url-pattern
,你只是从一些数据源获取图像作为InputStream
(例如从本地磁盘文件系统中获取FileInputStream)
,然后将其写入响应的通常Java IO方式的OutputStream
。
你只需要设置至少Content-Disposition
响应头为attachment
以确保客户获得另存为弹出的对话,否则将直接在浏览器中显示。设置Content-Type
和Content-Length
也很重要,以便浏览器知道服务器正在发送什么,并可以预测下载可能需要多长时间。
response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");
您可以在this article中找到完整的基本servlet示例。
注意:您无法控制客户端将保存图像的位置,这将是一个安全漏洞。通过这种方式,网站可以在客户端磁盘上写入恶意文件。
更新:根据您的更新,有两种选择:
你需要让客户本身火二人HTTP请求(我在your subsequent question回答了这个)
创建一个客户端应用程序,它直接在客户端执行所有任务,然后将其嵌入到您的网页中,例如Java Applet。通过小程序,您可以完全控制客户端环境。你可以执行几乎所有你想执行的Java代码,你可以可以直接写入文件到磁盘,而不要求客户端保存位置。您只需要由第三方公司签署小程序,或者客户需要在运行之前确认安全警告。