2016-05-01 33 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) }); 
相关问题