2017-08-23 5 views
0

サーバでファイルデータを解析しようとしていますが、問題なく動作していますが、アップロードフォルダ内のローカルディスクにアップロードし、次にデータを読み込んでいます。これはうまく動作しているコードですが、大きなxlsxファイルをアップロードするときに問題があります。excelファイルをアップロードし、hapi.jsにファイルをローカルに保存せずにサーバで解析する方法

server.route({ 
    method: 'post', 
    path: `${(options.apiBase || '/xlsx/')}get`, 
    config: { 
     payload: { 
      output: 'stream', 
      parse: true, 
      allow: 'multipart/form-data' 
     } 
    }, 
    handler: function (req, reply) { 
     try { 
      const data = req.payload; 
      if (data.file) { 
       let name = data.file.hapi.filename; 
       console.log("FIlename: " + name); 

       let path = __dirname + "/uploads/" + name; 
       let file = fs.createWriteStream(path); 

       data.file.pipe(file); 
       data.file.on('end', function (err) { 

        if (typeof require !== 'undefined') 
         XLSX = require('xlsx'); 

        const workbook = XLSX.readFile(path); 
        console.log("row======>>>>"); 
        const sheet_name_list = workbook.SheetNames; 
        const content = 
         XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]); 
        console.log(content); 

        var ret = { 
         filename: data.file.hapi.filename, 
         headers: data.file.hapi.headers 
        } 
        reply(JSON.stringify(content)); 
       }) 
      } catch (err) { 
       console.log('Err----------------------' + err); 
       // error handling 
       reply(Boom.badRequest(err.message, err)); 
      } 
     } 
}); 

next(); 
+0

hapijsドキュメントには、アップロードごとに一時ファイルが作成されることが記載されています。処理後にこのファイルを削除することができます –

答えて

0

config.payload.parseをfalseに設定する必要があります。これは生ストリームを返します。しかし、multipart/form-dataをアップロードしている場合は、自分で解析する必要があることに気づくでしょう。

config: { 
    payload: { 
     output: 'stream', 
     parse: false, 
     allow: 'multipart/form-data' 
    } 
} 

これはsubtextモジュールで処理されます。 https://github.com/hapijs/subtext/blob/0bf83af78e364518577913db1bbc9c27bc739d7a/lib/index.js#L67

関連する問題