【发布时间】:2014-01-04 02:45:29
【问题描述】:
我正在尝试实现一个文件上传器,其中 HTML 输入文件由 WebSocket 发送到 Nodejs 服务器。
尝试从 HTML 的 FileReader API 读取 BLOB 和二进制字符串中的文件,并将其发送到 Nodejs 服务器,以便将其写入服务器中的文件。在 Nodejs 部分尝试使用 ascii 或 base 64 编码的 createWriteStream 和 writeFile。
服务器中保存的文件仍然无法正常工作。
我错过了什么吗?
谢谢
更新
客户
var uploader = $("#uploader"),
files = uploader.prop('files'),
file_reader = new FileReader();
file_reader.onload = function(evt) {
socketClient.write({
'action': 'ExtensionSettings->upload',
'domain': structureUser.domain,
'v_id': ext,
'file': file_reader.result
});
};
file_reader.readAsDataURL(files[0]);
//readAsDataURL
uploader.replaceWith(uploader.clone());
服务器
var stream = fs.createWriteStream("file");
stream.once("open", function() {
stream.write(msg.file, "base64");
stream.on('finish', function() {
stream.close();
});
});
【问题讨论】:
-
请将客户端和服务器代码发给我们,没有它你很难猜出你做错了什么!
-
你能在服务器上抓包吗?
-
简单的方法是在客户端使用 dataURL 翻录到 base64 并将该 b64 字符串发送到您将 atob(str.split(",")[1]) 写入文件的节点使用二进制模式(不是 uft8 或 base64)。如果你变得更硬核并且只需要支持更新的浏览器,你实际上可以使用 Socket.send() developer.mozilla.org/en-US/docs/Web/API/WebSocket#send() 发送一个未添加的二进制 blob
-
@user2448953 对于它的价值,您可以考虑使用 BinaryJS (github.com/binaryjs/binaryjs) 来设置您可以更轻松地读取/写入的流。其中一个示例包括完全按照您在此处所做的操作。
-
同意布拉德的观点,binaryjs 做的完全一样。您正在尝试从头开始编写代码,然后对其进行调试。
标签: javascript html node.js file-upload websocket