如何在java websocket服务器上读取通过websocket发送的javascript BLOB数据

How to read javascript BLOB data sent over websocket on java websocket server

本文关键字:websocket javascript 数据 BLOB 读取 java 服务器      更新时间:2023-09-26

我试图通过javascript在我的网页上上传一个图片文件作为BLOB类型的文件,然后将该文件发送到我的java websocket服务器,以将该文件存储在用于该网页的服务器上。

我在websocker服务器java端的代码是读取BLOB数据并写入文件如下,

public void testMethod(final WebMessage message){
    ByteBuffer b = null;
    try {
        b = message.getByteBufferArg(0);
    } catch (WebMessageException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }
    File file = new File("/user/Desktop/pic.jpg");
    try {
        file.createNewFile();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        FileOutputStream stream = new FileOutputStream(file.getAbsoluteFile());
        stream.write(b.array());
        logger.info("done writing file");
        stream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        logger.trace(e.getMessage());
    }
}

然后当我试图打开图片时,它显示Error interpreting JPEG image file (Not a JPEG file: starts with 0x00 0x00)

基本上我想知道我怎么能读取这个BLOB数据发送到我的websocket服务器,我怎么能把这个数据写出来到一个可用的文件?

所以从Blob中读取的唯一方法是使用FileReader (https://developer.mozilla.org/en-US/docs/Web/API/FileReader),一旦您从Blob中读取数据(我只是在BinaryArray中读取- https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsBinaryString),您可以直接将其发送到输出流中的文件。

来自文档- https://developer.mozilla.org/en/docs/Web/API/Blob:

从Blob中提取数据示例

从Blob中读取内容的唯一方法是使用FileReader。下面的代码将Blob的内容作为类型化数组读取。

var reader = new FileReader();
reader.addEventListener("loadend", function() {
   // reader.result contains the contents of blob as a typed array
});
reader.readAsArrayBuffer(blob);

通过使用FileReader的其他方法,可以将Blob的内容读取为字符串或数据URL。

解决这个问题的方法是不将数据作为BLOB从javascript端发送,您需要将数据读取为某种可读格式。在这种情况下,我使用FileReader API来读取BLOB数据作为dataurl。使用该方法读取后,数据为base64可读格式,可以通过websocket发送,并在base64 String解码后写入另一端的文件。