Javascript 使用WebSocket和NodeJ上载文件
我试图实现一个文件上传器,其中一个HTML输入文件由WebSocket发送到Nodejs服务器 试图从HTML的FileReader API中读取BLOB和二进制字符串格式的文件,并将其发送到Nodejs服务器,以便将其写入服务器中的文件。已尝试在Nodejs部分中使用ascii或base 64编码的createWriteStream和writeFile 但保存在服务器中的文件仍然无法正常工作 我错过什么了吗 多谢各位 更新 客户Javascript 使用WebSocket和NodeJ上载文件,javascript,html,node.js,file-upload,websocket,Javascript,Html,Node.js,File Upload,Websocket,我试图实现一个文件上传器,其中一个HTML输入文件由WebSocket发送到Nodejs服务器 试图从HTML的FileReader API中读取BLOB和二进制字符串格式的文件,并将其发送到Nodejs服务器,以便将其写入服务器中的文件。已尝试在Nodejs部分中使用ascii或base 64编码的createWriteStream和writeFile 但保存在服务器中的文件仍然无法正常工作 我错过什么了吗 多谢各位 更新 客户 var uploader = $("#uploader"
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());
<form method="post" enctype="multipart/form-data" action="http://localhost:8080/fileupload">
<input name="filename" type="file">
<input type="submit">
</form>
服务器
var stream = fs.createWriteStream("file");
stream.once("open", function() {
stream.write(msg.file, "base64");
stream.on('finish', function() {
stream.close();
});
});
http = require('http');
formidable = require('formidable');
fs = require('fs');
http.createServer(function (req, res) {
if (req.url === '/fileupload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
var prevpath = files.filename.path;
var name = files.filename.name;
var newpath = './upload/' + name;
var is = fs.createReadStream(prevpath);
var os = fs.createWriteStream(newpath);
// more robust than using fs.rename
// allows moving across different mounted filesystems
is.pipe(os);
// removes the temporary file originally
// created by the post action
is.on('end',function() {
fs.unlinkSync(prevpath);
});
// prevents browser from hanging, assuming
// success status/processing
// is handled by websocket based server code
res.statusCode = 204;
res.end();
});
}
})
.listen (8080);
.readAsDataURL()返回格式为数据的字符串:MIMEtype;base64,。。。。
您应该删除逗号之前的部分,因为它不是base64编码文件的一部分,它是服务数据当您在NodeJ中传输数据时,您不使用write()而是使用pipe()。 因此,一旦您像以前一样拥有了写入流:var stream=fs.createWriteStream(“文件”); 然后将()管道连接到它,如:sourcestream.pipe(stream); 但是,由于文件是通过internet传输的,因此您的文件将以数据包的形式发送,因此它不会一次全部到达,而是以片段的形式到达,您必须使用缓冲区数组并手动计算数据块 您可以在此处了解详细信息: 还有一个模块也很容易使用,可能是您想要的:
如果你不一定介意检查插座,您还可以在客户端脚本中使用ajax表单POST,使用服务器上强大的模块处理表单上载:考虑在websocket使用的不同端口上启动单独的http服务器,然后通过表单中的传统POST操作上载文件。返回状态代码204(无内容)可确保浏览器在post操作后不会挂起。服务器代码假定“上载”目录已存在。这对我很有用: 客户
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());
<form method="post" enctype="multipart/form-data" action="http://localhost:8080/fileupload">
<input name="filename" type="file">
<input type="submit">
</form>
请给我们发送客户端和服务器代码,没有它很难猜测你做错了什么!您可以在服务器上捕获数据包吗?简单的方法是使用dataURL在客户端上插入base64,然后将b64字符串发送到节点,在节点上使用二进制模式(而不是uft8或base64)将atob(str.split(“,”[1])写入文件。如果你得到了更硬的内核,只需要支持更新的浏览器,你就可以使用Socket .SeD()@ USE2448 953来传输一个未添加的二进制BLB,因为它值得,你可以考虑使用BinaryJS()来设置你可以更容易地读写的流。其中一个示例包括完全按照您在这里所做的操作。同意Brad的说法,binaryjs也做完全相同的操作。您正在尝试从头开始编写代码,然后对其进行调试。如果没有任何外部nodejs库,这将如何完成?