2016-05-01 34 views
1

當我涉及到文件管理的時候,我遇到了一些麻煩,包括頭腦中的一些問題,以及NodeJS內部不存在的問題,並想知道是否有人可以指引我朝着正確的方向前進。如何通過NodeJS將文件上傳到S3並跟蹤瀏覽器的進度?

我有一個隨用戶需要同時發生的上傳隊列列表(允許他們隨意暫停或刪除下載),我需要該過程來擊中節點服務器以調整圖像大小或將視頻作爲需要。從這裏我需要Node使用AWS-SDK(我爲一般的沙盒測試設置了一個fakeS3服務器)通過S3上傳視頻或圖像,並且在上傳時我需要在瀏覽器中跟蹤上傳的進度。

我正在使用React和服務器端渲染與節點,所以我想必須有一個非常簡單的方式來處理這種情況,但我找不到以前做過這些的人。這裏有幾個概念,我搞亂:

Server.js(核心輸入)

server.use(express.static(path.join(__dirname, 'public'))); 
server.use(multer({ 
    dest: './public/temp', 
    limits: { 
     fieldNameSize: 50, 
     files: 1, 
     fields: 5, 
     fileSize: 1024 * 1024 
    }, 
    rename: (fieldname, filename) => { 
     return filename; 
    }, 
    onFileUploadStart: (file) => { 
     console.log('Starting file upload process.'); 
    }, 
    inMemory: true 
})); 
server.use(cookieParser()); 
server.use(bodyParser.urlencoded({ extended: true })); 
server.use(bodyParser.json()); 

中間路線(/上傳或東西)

export function uploadContent(req, res) { 
    const config = { 
     s3ForcePathStyle: true, 
     accessKeyId: 'ACCESS_KEY_ID', 
     secretAccessKey: 'SECRET_ACCESS_KEY', 
     endpoint: new AWS.Endpoint('http://localhost:4567'), // TODO make live 
    }; 

    const client = new AWS.S3(config); 

    const params = { 
     Key: 'Key', 
     Bucket: 'Bucket', 
     Body: fs.createReadStream(req.body.files[0]) 
    }; 

    client.upload(params, function uploadCallback (err, data) { 
     console.log(err, data); 
    }); 
} 

這是不行的,因爲身體分析器與路線衝突,multer也有時間(我願意接受其他建議),關於如何實現這一點的任何信息都非常棒。我不是在尋找完整的代碼,而是另一個想法,讓我走上正確的道路。我感謝任何幫助!

回答

0

你可以使用一個插座香奈兒您的瀏覽器和路線的NodeJS之間併發射事件開始,結束和進步,並使用httpUploadProgress事件:

var s3obj = new AWS.S3({params: {Bucket: 'myBucket', Key: 'myKey'}}); 
s3obj.upload({Body: body}). 
on('httpUploadProgress', function(evt) { 
     console.log(evt); 
     //Emit Here your events 
}). 
send(function(err, data) { console.log(err, data) }); 
相關問題