如何通过node.js将上传流传输到S3并向用户显示进度?
目标是:如何通过node.js将上传流传输到S3并向用户显示进度?,node.js,amazon-s3,upload,jquery-file-upload,busboy,Node.js,Amazon S3,Upload,Jquery File Upload,Busboy,目标是: 能够从浏览器上载文件 能够将上传直接流式传输到S3 将上载进度中继到浏览器 我花了一段时间才弄明白这一点(而且还没有找到解决StackOverflow上所有3个问题的答案),所以发布我的答案,以防其他人也有同样的问题 我愿意接受更好解决方案的建议(我的速度非常糟糕) 在前端HTML上 <input type="file" class="file" name="files[]"> 在服务器上 var Busboy = require('busboy'); var AWS =
<input type="file" class="file" name="files[]">
在服务器上
var Busboy = require('busboy');
var AWS = require('aws-sdk');
var socket = require('socket.io');
var express = require('express');
var http = require('http');
// Set up Express
var app = express();
var server = http
.Server(app)
.listen(80);
var io = socket(server);
// keeps track of all the open sockets
var sockets = {};
io.on('connection', function (socket) {
var uniqueId = _.random(0, 100000000);
app.socket[uniqueId] = socket;
socket.emit('id', uniqueId);
});
// Set up upload route
app.post('/upload', function (req, res) {
AWS.config.update({
appKey: '',
jsKey: '',
});
var s3 = new AWS.S3();
var busboy = new Busboy({
headers: req.headers
});
busboy.on('file', function(fieldname, file, filename) {
s3.upload({
Bucket: 'bucketname',
Key: new Date().getTime() + filename,
Body: file //stream
}, function(err, file){
res.json({
success: true
});
}).on('httpUploadProgress', function(evt) {
//emit progress
sockets[req.query.socketId].emit('uploadProgress', evt);
});
});
req.pipe(busboy);
});
关于前端HTML
<input type="file" class="file" name="files[]">
在服务器上
var Busboy = require('busboy');
var AWS = require('aws-sdk');
var socket = require('socket.io');
var express = require('express');
var http = require('http');
// Set up Express
var app = express();
var server = http
.Server(app)
.listen(80);
var io = socket(server);
// keeps track of all the open sockets
var sockets = {};
io.on('connection', function (socket) {
var uniqueId = _.random(0, 100000000);
app.socket[uniqueId] = socket;
socket.emit('id', uniqueId);
});
// Set up upload route
app.post('/upload', function (req, res) {
AWS.config.update({
appKey: '',
jsKey: '',
});
var s3 = new AWS.S3();
var busboy = new Busboy({
headers: req.headers
});
busboy.on('file', function(fieldname, file, filename) {
s3.upload({
Bucket: 'bucketname',
Key: new Date().getTime() + filename,
Body: file //stream
}, function(err, file){
res.json({
success: true
});
}).on('httpUploadProgress', function(evt) {
//emit progress
sockets[req.query.socketId].emit('uploadProgress', evt);
});
});
req.pipe(busboy);
});
我遇到的一个问题是上传速度慢,所以对更好的建议持开放态度。我遇到的一个问题是上传速度慢,所以对更好的建议持开放态度。