我试图通过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解码后写入另一端的文件。