Javascript 使用WebSocket和NodeJ上载文件

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"

我试图实现一个文件上传器,其中一个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());
<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库,这将如何完成?