2014-02-17 20 views
15

誰能告訴我如何上傳文件使用nodejs和HAPI?如何使用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); 
} 
+0

工作的代碼不知道關於高致病性禽流感,但使用特快從連接得到'multipart'解析器的中間件,使得進入FORMDATA可以正確解析到的任何文件領域。 – Roman

+0

@羅曼感謝您的回覆。但我只使用HAPI不表示。 – Realdheeraj

+1

我只是說你可以使用解析器。嘗試[multipraty](https://github.com/andrewrk/node-multiparty)FormData解析器。 – Roman

回答

3

最後我上傳使用高致病性禽流感,並感謝羅馬的大文件的解決方案。

這裏是解決方案:

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) 

      }); 

    } 
} 
+0

太棒了!它正在工作。 :) – RealDeepak

+4

這種方法重複了HAPI框架已經爲您處理的工作。下面的'parse:true'方法是一個更好的解決方案。 – GregT

+11

你真的沒有理由自己處理多部分解析。另外,你使用多方的方式充其量也是尷尬的,讓它將數據寫入文件,這樣你就可以讀取這些文件(並再次寫入它們!)。 –

39

對於新的讀者,高致病性禽流感已經使用多方使用pez來處理多崗位要求。從hapi文檔;

如果有效負載是'multipart/form-data'並且解析爲真,則字段值以文本形式呈現,而文件以流形式提供。來自'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")); 
     } 
}); 
5

您可以訪問在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); 

     }); 
    }); 
};