2010-06-03 153 views
1

我是新来的,只是在J2EE上开发。 我正在修改现有的应用程序(一个OpenSource项目)。 我需要保存服务器发送的客户端上的图像,但我不知道如何。 此活动必须以透明的方式完成,而不会影响应用程序的现有操作。Servlet从服务器发送图像并保存在客户端

从完成的测试中,我得到这个错误: java.lang.IllegalStateException:getWriter()has already been Called for this response。

根据你自己的意见应该如何执行这个任务? 如何在本地保存客户端的图像?

更新

感谢您的答案。 我的问题是:

  1. 在服务器上生成图像,而不是直接客户端请求(没有链接点击网页上),将图片用其他服务组成的网络上。
  2. 重建服务器上的图像。
  3. 必须将此图片发送给客户端才能在本地保存。
  4. 所以我希望它出现一个窗口,您分配的目标图像
  5. 加我希望其他应用程序不受此活动的影响。
  6. 该应用程序尚未投入生产。

非常感谢您的回复。

回答

2

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-TypeContent-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示例。

注意:您无法控制客户端将保存图像的位置,这将是一个安全漏洞。通过这种方式,网站可以在客户端磁盘上写入恶意文件。


更新:根据您的更新,有两种选择:

  1. 你需要让客户本身火二人HTTP请求(我在your subsequent question回答了这个)

  2. 创建一个客户端应用程序,它直接在客户端执行所有任务,然后将其嵌入到您的网页中,例如Java Applet。通过小程序,您可以完全控制客户端环境。你可以执行几乎所有你想执行的Java代码,你可以可以直接写入文件到磁盘,而不要求客户端保存位置。您只需要由第三方公司签署小程序,或者客户需要在运行之前确认安全警告。

1

它取决于浏览器如何处理所有类型的输出。给网页提供一个浏览器可以理解的html内容类型,并最终呈现一个我们可以看到的页面。图像被赋予图像/ jpeg等内容类型,这些图像在页面中呈现为图像等。为了强制下载提示,需要使用二进制文件的内容类型而不是图像的内容类型,以便浏览器强制下载比显示图像。为了确保使用“application/octetstream”之类的东西......我无法准确回想起它,但很容易让Google知道。

相关问题