【问题标题】:How to read a blob being sent through ajax to a Java server如何读取通过 ajax 发送到 Java 服务器的 blob
【发布时间】:2019-11-10 20:46:26
【问题描述】:

所以我试图通过 AJAX 将 BLOB 图像发送到 Java 服务器,然后将其转换为 btye 数组。我能够得到 BufferedInputStream;但是,当我尝试将其转换为字节数组时,程序会挂起并且不会继续。有谁知道为什么会这样?

客户端是这样的:

 $.ajax({
        type: "POST",
        url: "/com/uploadImage/",

        data: blobImage,
        cache: false,
        contentType: false,
        processData: false,
        success: function (data) {
            console.log(data);
        }

这是我的java代码:

  public void handleRequest() {
    try {
       BufferedInputStream bis = new BufferedInputStream(this.getSocket().getInputStream());

       //this is the line that causes the program to hang
       byte[] bytes = IOUtils.toByteArray(bis);
       FileUtils.writeByteArrayToFile(new File("image.png"), bytes);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 你试过调试你的Java代码吗?有什么错误输出吗?
  • @TimBiegeleisen 令人惊讶的是,根本没有错误。我尝试调试,我能够读取 BufferedInputStream 并查看数据;但是,一旦我尝试跳过byte[] bytes = IOUtils.toByteArray(bis); 行,它似乎就卡住了;
  • BLOB 图像有多大?
  • @TimBiegeleisen 我已经尝试过使用从 50kb 到几百 kb 的图像,结果相同
  • 我的猜测是Java与此无关。验证您是否可以从浏览器连接到该 URL,然后验证您是否可以从 Java 连接。我的猜测是您无法从 Java 连接。

标签: java httprequest blob


【解决方案1】:

我想我知道这里发生了什么,但我可能错了。 IOUtils.toByteArray 行可能不会停止,直到它到达流的末尾。因为更多数据随时可能通过网络到达,呼叫将在那里等待,直到它知道没有其他数据到达。只有当客户端上的 AJAX 调用完成时,它才会知道这一点。这表明问题在于客户端卡住并因此阻止了服务器。

但是为什么客户端卡住了?因为它正在等待响应。 HTTP 是双向的,服务器应该在请求通过套接字时确认请求,而无需等待连接结束。

实际上,您应该做的不是将整个内容读入byte[],而是应该在循环中一点一点地读取它。然后,一旦客户端发送了构成请求的所有数据,您就应该做出响应。在 HTTP 中,客户端在向服务器发送空行时完成请求。

不过,这纯粹是猜测,应该这样对待。我可能在这里遗漏了一些东西。

另外,附注 - IOUtils.toByteArray 不需要您将输入流包装在 BufferedInputStream 中。

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2021-10-13
    • 2013-02-09
    • 2018-02-27
    • 2011-03-11
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多