如何上傳檔案
檔案可以原樣傳送
<!doctype html>
<html lang="en">
<body>
<input type="file" onchange="upload(this.files)" />
<script src="/path/to/socket.io.js"></script>
<script>
const socket = io();
function upload(files) {
socket.emit("upload", files[0], (status) => {
console.log(status);
});
}
</script>
</body>
</html>
檔案將在伺服器端接收為 Buffer
import { writeFile } from "fs";
io.on("connection", (socket) => {
socket.on("upload", (file, callback) => {
console.log(file); // <Buffer 25 50 44 ...>
// save the content to the disk, for example
writeFile("/tmp/upload", file, (err) => {
callback({ message: err ? "failure" : "success" });
});
});
});
其他注意事項
maxHttpBufferSize
限制
上傳檔案時,您可能會達到 maxHttpBufferSize
值,這是允許的最大訊息大小(以位元組為單位)。預設為 1 MB。
您可以根據您的使用案例增加此值
import { Server } from "socket.io";
const io = new Server({
maxHttpBufferSize: 1e8 // 100 MB
});
透過網路
與其他二進位結構(ArrayBuffer、Blob)一樣,emit()
方法的參數將透過網路作為兩個 WebSocket 框架傳送
首先,一個文字框架
451-["upload",{"_placeholder":true,"num":0}]
||||└─ JSON-encoded payload with placeholders for binary attachments
||||
|||└─ separator
||└─ number of binary attachments
|└─ socket.io BINARY EVENT packet type
└─ engine.io MESSAGE packet type
然後,一個二進位框架(每個二進位結構一個)
<0x25 0x50 0x44 ...>
根據您的使用案例,您可以透過使用自訂解析器來變更此行為。