如何通过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 =

目标是:

  • 能够从浏览器上载文件
  • 能够将上传直接流式传输到S3
  • 将上载进度中继到浏览器
  • 我花了一段时间才弄明白这一点(而且还没有找到解决StackOverflow上所有3个问题的答案),所以发布我的答案,以防其他人也有同样的问题

    我愿意接受更好解决方案的建议(我的速度非常糟糕)

    在前端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);
    });
    
    关于前端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);
    });
    

    我遇到的一个问题是上传速度慢,所以对更好的建议持开放态度。我遇到的一个问题是上传速度慢,所以对更好的建议持开放态度。