【问题标题】:How to upload files using nodejs and HAPI?如何使用 nodejs 和 HAPI 上传文件?
【发布时间】:2014-03-16 09:54:01
【问题描述】:

谁能告诉我如何使用 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>

这是我的 Nodejs 代码:

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

uploadFiles:function(req,reply){
    console.log(req.payload);
}

【问题讨论】:

  • 不确定 HAPI,但使用 Express 可以从 Connect 中获得 multipart 解析器中间件,因此传入的 FormData 可以正确解析为任一字段文件。
  • @Roman 感谢您的回复。但我只使用 HAPI 不表达。
  • 我只是告诉你可以使用解析器。试试multipratyFormData 解析器。
  • @Roman 感谢您提供信息,但如何将这个多方 FormData 解析器与 HAPI 一起使用。它在 Express 中的工作就像一个魅力。

标签: javascript node.js express hapijs


【解决方案1】:

对于新读者,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"));
      }
});

【讨论】:

    【解决方案2】:

    您可以访问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);
    
            });
        });
    };
    

    【讨论】:

      【解决方案3】:

      终于找到了使用 HAPI 上传大文件的解决方案,感谢 Roman。

      解决办法如下:

      server.js 代码

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

      处理程序代码:

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

      【讨论】:

      • 这种方法重复了 HAPI 框架已经为您处理的工作。下面的parse: true 方法是更好的解决方案。
      • 你真的没有理由自己处理多部分解析。此外,您使用多方的方式充其量也很尴尬,让它将数据写入文件,以便您可以读回这些文件(然后再次写入它们?!)。
      • @GregT 我可能弄错了,但我认为当您处理非常大的文件有效负载时,您需要自己处理多个部分,您希望避免将它们加载到内存中,并且您想要一个真正的溪流。 Hapi 文档状态:“请注意,多部分有效负载的有效负载流是在加载到内存中的整个多部分内容之上创建的合成接口。为避免将大型多部分有效负载加载到内存中,请将 parse 设置为 false 并在处理程序中处理多部分有效负载使用流式解析器(例如 pez)"
      • @DavidM 这是一个有趣的用例,但这不是最初的问题想要解决的。不过公平点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2018-01-02
      • 2014-01-04
      • 2014-04-08
      • 1970-01-01
      相关资源
      最近更新 更多