【发布时间】:2021-12-31 20:35:24
【问题描述】:
我正在尝试使用 WebSockets 从客户端向 NodeJS 服务器发送多个文件。
要发送一个文件,我目前执行以下操作:
// Client
let upload = document.getElementById('upload')
button.onclick = async function() {
let file = upload.files[0];
let byteFile = await getAsByteArray(file);
socket.send(byteFile);
}
async function getAsByteArray(file) {
return new Uint8Array(await readFile(file))
}
function readFile(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader()
reader.addEventListener("loadend", e => resolve(e.target.result))
reader.addEventListener("error", reject)
reader.readAsArrayBuffer(file)
});
}
// Server
ws.on('message', function incoming(message) {
// This returns a buffer which is what I'm looking for when working with a single file.
console.log(message);
return;
}
这适用于一个文件。我可以根据需要使用缓冲区并处理文件。要发送两个文件,我的想法是将每个文件转换为 Uint8Array(就像我对单个文件所做的那样)并像这样推送到数组:
// Client
let filesArray = [];
let files = upload.files; // Grab uploaded Manifests
for (let file of files) {
let byteFile = await getAsByteArray(file);
filesArray.push(byteFile);
}
socket.send(filesArray);
与处理一个文件的方式相同,服务器为发送的数组返回一个缓冲区;但是,我不确定如何使用它。我需要每个文件成为它们自己的缓冲区才能使用它们。我在这里采取了错误的方法吗?还是我只是错过了一些能够处理每个文件的转换?
【问题讨论】:
-
试试看。将每个文件作为一条消息发送,就像每个文件一条消息一样。在服务器上,您会看到每个文件都有一个消息事件。
-
我确定我想多了。我需要同时发送两个文件。发送两条单独的消息将无法完成我的需要。
-
我不建议通过 webSocket 上传多个文件。我建议您通过 http 上传它们,因为 http 更适合流式传输,并且有更多支持可以帮助您处理错误等......您可以通过 http 分段上传这两个文件。
-
您缺少的部分是发送元信息:您要发送的文件的名称是什么?数据的 MIME 类型是什么?它是如何编码的?例如,HTTP 具有指定所有这些信息的标头。
标签: javascript node.js websocket