如何使用nodejs和HAPI上传文件?

Rea*_*raj 18 javascript node.js express hapijs

谁能告诉我如何使用nodejs和HAPI上传文件?

我在处理程序中获取二进制数据.

这是我的HTML代码:

function sendFormFromHTML(form) {
        //form = $(".uploadForm").form;
        var formData = new FormData(form);
        formData.append('id', '123456'); // alternative to hidden fields
        var xhr = new XMLHttpRequest();
        xhr.open('POST', form.action, true);
        xhr.onload = function(e) { alert(this.responseText) };
        xhr.send(formData);
        return false;
    } 



<form method="post" id="uploadForm" action="http://localhost:3000/api/uploadfiles" enctype="multipart/form-data">
    <label for="upload">File (Binary):</label>
    <input type="file" name="upload" class="fileupload" /><br/>

    <input type="button" class="submit" value="Submit" onclick="sendFormFromHTML(this.form);"/>
  </form>
Run Code Online (Sandbox Code Playgroud)

这是My Nodejs代码:

server.route({
    method: 'POST',
    path: '/api/uploadfiles',
    config: {        
        handler: currentposition.uploadFiles,
    }
});

uploadFiles:function(req,reply){
    console.log(req.payload);
}
Run Code Online (Sandbox Code Playgroud)

uba*_*aci 41

对于新读者,hapi 已经使用多方使用pez来处理多部分帖子请求.来自hapi文档;

如果有效负载是'multipart/form-data'并且parse为true,则字段值表示为文本,而文件作为流提供.来自"multipart/form-data"上传的文件流还将具有包含文件名和标头属性的属性hapi.

例;

server.route({
   method: 'POST',
   path: '/create',
   config: {
      payload:{
            maxBytes: 209715200,
            output:'stream',
            parse: true
      }, 
      handler: function (request, reply) {
          request.payload["htmlInputName"].pipe(fs.createWriteStream("test"));
      }
});
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以访问https://github.com/pandeysoni/Hapi-file-upload-download访问工作代码

/*
 * upload file
 */

exports.uploadFile = {
    payload: {
        maxBytes: 209715200,
        output: 'stream',
        parse: false
    },
    handler: function(requset, reply) {
        var form = new multiparty.Form();
        form.parse(requset.payload, function(err, fields, files) {
            if (err) return reply(err);
            else upload(files, reply);
        });
    }
};

/*
 * upload file function
 */

var upload = function(files, reply) {
    fs.readFile(files.file[0].path, function(err, data) {
        checkFileExist();
        fs.writeFile(Config.MixInsideFolder + files.file[0].originalFilename, data, function(err) {
            if (err) return reply(err);
            else return reply('File uploaded to: ' + Config.MixInsideFolder + files.file[0].originalFilename);

        });
    });
};
Run Code Online (Sandbox Code Playgroud)


Rea*_*raj 4

最后我得到了使用 HAPI 上传大文件的解决方案,感谢 Roman。

这是解决方案:

服务器.js代码

server.route({
    method: 'POST',
    path: '/api/uploadfiles',
    config: {
          payload:{
                maxBytes:209715200,
                output:'stream',
                parse: false
          }, 
          handler: currentposition.uploadFiles,
    }
});
Run Code Online (Sandbox Code Playgroud)

处理程序代码:

var currentpositionApi = {

    fs : require('fs'),
    multiparty: require('multiparty'),
    uploadFiles:function(req,reply){
         var form = new currentpositionApi.multiparty.Form();
            form.parse(req.payload, function(err, fields, files) {
                currentpositionApi.fs.readFile(files.upload[0].path,function(err,data){
                    var newpath = __dirname + "/"+files.upload[0].originalFilename;
                    currentpositionApi.fs.writeFile(newpath,data,function(err){
                        if(err) console.log(err);
                        else console.log(files)
                    })
                })
                console.log(files)

            });

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您确实没有理由自己处理多部分解析。此外,您使用多方的方式充其量也很尴尬,让它将数据写入文件只是为了您可以读回这些文件(然后再次写入它们?!)。 (11认同)
  • 这种方法会重复 HAPI 框架已经为您处理的工作。下面的“parse: true”方法是一个更好的解决方案。 (5认同)