使用Websockets和Nodejs上传文件

我试图实现一个file upload器,其中一个HTMLinput文件由WebSocket发送到Nodejs服务器。

试图从HTML的FileReader API中读取BLOB和二进制string中的文件,并将其发送到Nodejs服务器,以便将其写入服务器中的文件。 在Nodejs部分尝试了使用ascii或base 64编码的createWriteStream和writeFile。

仍保存在服务器上的文件无法正常工作。

我错过了什么吗?

谢谢

UPDATE

客户

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(); }); }); 

.readAsDataURL()以格式数据返回string:MIMEtype; base64,….你应该删除逗号前的部分,因为它不是base64编码文件的一部分,它是服务数据

在nodejs中stream数据时,不要使用write(),而要使用pipe()。 所以,一旦你有你的写入stream如你所做:var stream = fs.createWriteStream(“file”); 那么你pipe()如下所示:sourcestream.pipe(stream); 但是由于文件是通过互联网传输的,因此您的文件将以数据包的forms发送,所以它不会一次全部到达,而是分段的,您必须使用缓冲区数组并手动计数数据块。

你可以在这里了解细节: http : //code.tutsplus.com/tutorials/how-to-create-a-resumable-video-uploade-in-node-js–net-25445

有一个可用的模块,非常容易使用,可能是你想要的: https : //github.com/nkzawa/socket.io-stream

如果你不关心套接字,你也可以在你的客户端脚本中使用ajax表单POST来使用服务器上的强大模块来处理表单上传: https : //github.com/felixge/节点厉害

考虑在websocket使用的不同端口上启动一个单独的http服务器,然后通过传统的post操作将file upload到表单中。 返回状态码204(无内容)确保浏览器在发布后不会挂起。 服务器代码假定目录'upload'已经存在。 这对我工作:

客户

 <form method="post" enctype="multipart/form-data" action="http://localhost:8080/fileupload"> <input name="filename" type="file"> <input type="submit"> </form> 

服务器

 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);