0

我正在使用 gwt 开发一个 Web 应用程序,并在服务器端生成一个 BufferedImg,我想将其发送到客户端。我不知道该怎么做...

4

5 回答 5

1

您必须将图像作为文件保存在“公共”位置,然后在客户端生成图像的 URL。否则,您可以将图像生成为 HttpServlet 的 servlet 输出。

您不能将图像直接发送到客户端。

于 2013-10-31T07:21:55.117 回答
1

您可以在服务器端将图像生成为 BufferedImage,然后使用Remote Procedure Calls将其传递到客户端。

您必须实施:

  • 服务器端

    1. 在服务器端扩展RemoteServiceServlet的ImageServiceImpl类。此类将生成一个 BufferedImage:
      File imagePath = new File(url); BufferedImage image = ImageIO.read(imagePath); 您将把这个图像发送到您的客户端。
  • 客户端

    1. 在您的客户端,您必须创建一个同步的ImageService 接口,它扩展了RemoteService接口。

    2. 您还必须基于您的原始服务接口创建另一个客户端接口,即异步接口 ( 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 个步骤:

  1. 使用 GWT.create() 实例化服务接口。

  2. 创建一个异步回调对象,以便在 RPC 完成时收到通知。

  3. 拨打电话。

这些是要遵循的通用规则,我建议这不是作为您问题的最终解决方案,而是作为指导,以便了解 RPC 是如何定义和工作的。RPC一开始有点复杂,但是一旦你理解了机制,你就可以将各种数据从你的服务器传递到你的客户端。

[编辑]

对于图像类型,请记住,在 GWT 中,HTML 图像是通过 IMG 元素中的 SRC 属性加载的。通过 RPCT 将图像从服务器传递到客户端不能直接完成,而是使用技巧:

  1. 让 RPC 调用返回 Base 64 格式的图像字符串。
  2. 在 onSuccess() 方法中,使用该结果字符串作为setUrl()的参数(设置 SRC 属性)。
于 2013-11-01T10:15:29.107 回答
0

我将图像生成为 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();
 }
}
于 2013-11-01T04:26:16.833 回答
0

您可以使用 Base64 编码来序列化您的图像并通过网络发送。不过,您必须找到使用 GWT 对其进行解码的解决方案。这可能会让您入门如何使用 GWT 将短字符串编码/解码为 Base64?

于 2013-10-31T11:36:51.490 回答
0

要在 GWT 客户端中显示存储在服务器上的静态图像,只需执行以下操作:

  1. 将图像存储在您的 GWT MyApp/war/images 文件夹中。

  2. 在对象文本字段中嵌入图像名称。例如,如果您有一个名为“Employee”的对象,其中包含 bio 字段,则嵌入文本“IMAGE: jane_doe.jpg”。

  3. 您的对象应该使用 jason 下载到客户端(通常在您的 EntryPointImpl.onModuleLoad();

  4. 使用正则表达式从文本字段中提取文件名。

  5. 设置字符串路径=“图像/”+文件名。

  6. 创建图像对象;例如 Image img=new Image(path);

  7. 款式和尺寸随心所欲。

GWT 将使用 HTTP GET 检索图像。

于 2018-04-05T20:58:02.717 回答