我正在使用 gwt 开发一个 Web 应用程序,并在服务器端生成一个 BufferedImg,我想将其发送到客户端。我不知道该怎么做...
5 回答
您必须将图像作为文件保存在“公共”位置,然后在客户端生成图像的 URL。否则,您可以将图像生成为 HttpServlet 的 servlet 输出。
您不能将图像直接发送到客户端。
您可以在服务器端将图像生成为 BufferedImage,然后使用Remote Procedure Calls将其传递到客户端。
您必须实施:
服务器端
- 在服务器端扩展RemoteServiceServlet的ImageServiceImpl类。此类将生成一个 BufferedImage:
File imagePath = new File(url); BufferedImage image = ImageIO.read(imagePath);
您将把这个图像发送到您的客户端。
- 在服务器端扩展RemoteServiceServlet的ImageServiceImpl类。此类将生成一个 BufferedImage:
客户端
在您的客户端,您必须创建一个同步的ImageService 接口,它扩展了RemoteService接口。
您还必须基于您的原始服务接口创建另一个客户端接口,即异步接口 ( ImageServiceAsync )。如 GWT 项目中所述
异步方法调用的本质要求调用者传入一个回调对象,该对象可以在异步调用完成时得到通知,因为根据定义,调用者在调用完成之前不能被阻塞。出于同样的原因,异步方法没有返回类型。他们通常返回无效。如果您希望更好地控制待处理请求的状态,请改为返回 Request。进行异步调用后,所有与调用者的通信都是通过传入的回调对象进行的。
最后将您的 servlet 添加到您的 web.xml
<servlet>
<servlet-name>ImageServiceImpl</servlet-name>
<servlet-class>
com.example.image.server.ImageServiceImpl
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageServiceImpl</servlet-name>
<url-pattern>/com.example.image.Image/ImageService</url-pattern>
</servlet-mapping>
为了将您的图像从服务器发送到客户端,您必须遵循 3 个步骤:
使用 GWT.create() 实例化服务接口。
创建一个异步回调对象,以便在 RPC 完成时收到通知。
- 拨打电话。
这些是要遵循的通用规则,我建议这不是作为您问题的最终解决方案,而是作为指导,以便了解 RPC 是如何定义和工作的。RPC一开始有点复杂,但是一旦你理解了机制,你就可以将各种数据从你的服务器传递到你的客户端。
[编辑]
对于图像类型,请记住,在 GWT 中,HTML 图像是通过 IMG 元素中的 SRC 属性加载的。通过 RPCT 将图像从服务器传递到客户端不能直接完成,而是使用技巧:
- 让 RPC 调用返回 Base 64 格式的图像字符串。
- 在 onSuccess() 方法中,使用该结果字符串作为setUrl()的参数(设置 SRC 属性)。
我将图像生成为 BufferedImage 并将其转换为 ByteArrayOutputStream 并返回如下..
public void downloadImage(final HttpServletRequest req,final HttpServletResponse res) throws Exception {
File imagePathFile = new File(url);
if (imagePathFile.exists()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedImage image = ImageIO.read(imagePathFile);
ImageIO.write(image, "jpg", baos);
StringBuffer sbFilename = new StringBuffer();
sbFilename.append("Image_");
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sbFilename.append(sdf.format(new Date()));
sbFilename.append(".jpg");
StringBuffer sbContentDispValue = new StringBuffer();
sbContentDispValue.append("inline");
sbContentDispValue.append("; filename=");
sbContentDispValue.append(sbFilename);
res.setContentType("image/jpeg/jpg/png");
res.addHeader("Cache-Control", "max-age=30");
res.addHeader("Content-disposition", sbContentDispValue.toString());
res.setContentLength(baos.size());
ServletOutputStream os = res.getOutputStream();
baos.writeTo(os);
os.flush();
os.close();
}
}
您可以使用 Base64 编码来序列化您的图像并通过网络发送。不过,您必须找到使用 GWT 对其进行解码的解决方案。这可能会让您入门如何使用 GWT 将短字符串编码/解码为 Base64?
要在 GWT 客户端中显示存储在服务器上的静态图像,只需执行以下操作:
将图像存储在您的 GWT MyApp/war/images 文件夹中。
在对象文本字段中嵌入图像名称。例如,如果您有一个名为“Employee”的对象,其中包含 bio 字段,则嵌入文本“IMAGE: jane_doe.jpg”。
您的对象应该使用 jason 下载到客户端(通常在您的 EntryPointImpl.onModuleLoad();
使用正则表达式从文本字段中提取文件名。
设置字符串路径=“图像/”+文件名。
创建图像对象;例如 Image img=new Image(path);
款式和尺寸随心所欲。
GWT 将使用 HTTP GET 检索图像。