2016-11-21 108 views
2

我現在正在使用NodeJS服務器(ExpressJS)提供我的Web應用程序。新的要求之一是用戶能夠將大型視頻(可能在演出中)上傳到服務器。他們稍後將能夠再次下載它們。我可以用當前的堆棧來實現嗎?將大文件上傳到NodeJS網絡服務器

我遇到了使用Multer JS與前端指定的「multipart/form-data」的教程。如果我使用它,我的Express能夠在向服務器磁盤寫入巨大的單個視頻文件時提供其他HTTP請求嗎?

回答

1

Multer應該可以正常工作。它將通過HTTP將數據流傳輸到磁盤上的文件。它不會鎖定你的服務器。然後,在您的端點中,您可以訪問該文件位置,並可以根據需要執行任何操作。

+1

在一個側面說明:你那麼就上傳該文件到S3?如果你是,你實際上可以讓客戶端直接將文件上傳到S3。這將使您的節點服務器不必處理GB的數據。而且S3可能會將您的文件恢復到比您自己的服務器更快的速度。 – Randy

+0

上傳到S3似乎是一個很好的解決方案。看到你在推薦它時,我認爲在安全性方面做到這一點是安全的?當然你不希望任何人開始向你的S3上傳文件,那麼是否有某種認證方案? – jiminssy

+0

客戶端向您的API請求訪問令牌給S3。您的API基本上使用Amazon提供的S3庫創建此令牌。這是一個臨時令牌,您的客戶端將使用它連接到S3以上載文件。上傳後,您可以使用路徑或標識符回撥至您的API。然後,您的API可以使用S3文件,但它是可取的。 – Randy

2

有這個做自己(〜20GB的文件,無需multer)我可以推薦以下(可能其中大部分你已經考慮過,但出於完整性):

  1. 選擇合適的上傳控件(或寫你自己的,但基本的東西,口吃了起來的數據是最好的。我用plupload我認爲)

  2. 在服務器上進行API來處理接收到的塊數據,並上傳期間寫出來到一個臨時位置(您也可能希望散列和檢查單個作品)。

  3. 一旦上傳完成後,檢查文件(我使用的客戶端生成一個散列,並檢查其對上傳的數據)

+0

只是好奇,是否有你決定不使用'multer'的原因? – Randy

+1

我在4/5年前就做到了......不要認爲這個項目甚至存在(當我這樣做的時候,我們仍然用閃光燈做了很多HTML5補光:O) –

0
var express = require("express"); 

    var app = express(); 
    var async = require('async'); 
    var fs = require('fs'); 
    var client = redis.createClient(); 
    var multiparty = require('multiparty'); 
    var util = require('util'); 

    app.post('/',function(req,res){ 

     var form = new multiparty.Form(); 

     form.parse(req, function(err, fields, files) { 

      client.get(fields.otp, function(err, reply) { 
    var oldpath = files.file[0].path; 
          var newpath = path + files.file[0].originalFilename; 
          fs.rename(oldpath, newpath, function (err) { 
          if (err) throw err; 
          res.write('File uploaded and moved!'); 
          res.end(); 
          }); 
    } 
    } 



app.listen(2001,function(){ 
    console.log("Server is running on port 2001"); 
}); 
相關問題