我現在正在使用NodeJS服務器(ExpressJS)提供我的Web應用程序。新的要求之一是用戶能夠將大型視頻(可能在演出中)上傳到服務器。他們稍後將能夠再次下載它們。我可以用當前的堆棧來實現嗎?將大文件上傳到NodeJS網絡服務器
我遇到了使用Multer JS與前端指定的「multipart/form-data」的教程。如果我使用它,我的Express能夠在向服務器磁盤寫入巨大的單個視頻文件時提供其他HTTP請求嗎?
我現在正在使用NodeJS服務器(ExpressJS)提供我的Web應用程序。新的要求之一是用戶能夠將大型視頻(可能在演出中)上傳到服務器。他們稍後將能夠再次下載它們。我可以用當前的堆棧來實現嗎?將大文件上傳到NodeJS網絡服務器
我遇到了使用Multer JS與前端指定的「multipart/form-data」的教程。如果我使用它,我的Express能夠在向服務器磁盤寫入巨大的單個視頻文件時提供其他HTTP請求嗎?
Multer應該可以正常工作。它將通過HTTP將數據流傳輸到磁盤上的文件。它不會鎖定你的服務器。然後,在您的端點中,您可以訪問該文件位置,並可以根據需要執行任何操作。
有這個做自己(〜20GB的文件,無需multer)我可以推薦以下(可能其中大部分你已經考慮過,但出於完整性):
選擇合適的上傳控件(或寫你自己的,但基本的東西,口吃了起來的數據是最好的。我用plupload我認爲)
在服務器上進行API來處理接收到的塊數據,並上傳期間寫出來到一個臨時位置(您也可能希望散列和檢查單個作品)。
一旦上傳完成後,檢查文件(我使用的客戶端生成一個散列,並檢查其對上傳的數據)
只是好奇,是否有你決定不使用'multer'的原因? – Randy
我在4/5年前就做到了......不要認爲這個項目甚至存在(當我這樣做的時候,我們仍然用閃光燈做了很多HTML5補光:O) –
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");
});
在一個側面說明:你那麼就上傳該文件到S3?如果你是,你實際上可以讓客戶端直接將文件上傳到S3。這將使您的節點服務器不必處理GB的數據。而且S3可能會將您的文件恢復到比您自己的服務器更快的速度。 – Randy
上傳到S3似乎是一個很好的解決方案。看到你在推薦它時,我認爲在安全性方面做到這一點是安全的?當然你不希望任何人開始向你的S3上傳文件,那麼是否有某種認證方案? – jiminssy
客戶端向您的API請求訪問令牌給S3。您的API基本上使用Amazon提供的S3庫創建此令牌。這是一個臨時令牌,您的客戶端將使用它連接到S3以上載文件。上傳後,您可以使用路徑或標識符回撥至您的API。然後,您的API可以使用S3文件,但它是可取的。 – Randy