使用NodeJS将文件不完整地复制到Amazon S3

时间:2018-11-01 08:47:19

标签: node.js express amazon-s3

出于可靠性方面的考虑,我将一些图像从外部源传输到Amazon S3存储。

但是,图像被截断了,如下图所示。
我使用的代码具有以下逻辑:

const request = require('request');
let r = request(pictureUrl);
r.on('response', function(rs){
  let newFileName = new Date().getTime() + '_' + externalId+'.jpg';
  let localPath = __dirname+'/../../temp_files/'+newFileName+'';
  let ws = fs.createWriteStream(localPath);
  rs.pipe(ws);
  rs.on('end', function(){
    fs.readFile(localPath, (error, fileContent) => {
      uploadToS3(fileContent, newFileName, 'profile_pics', function (err, response) {
        fs.unlink(localPath, (err) => {

           /* send response to browser */

我认为是以下原因之一:
1. r.on('response' <-文件尚未收到,接下来的过程开始。
2. rs.on('end' <-该文件尚未本地写入,下一个进程开始。
3. fs.unlink(localPath <-在uploadToS3(fileContent完成之前执行。

意见?

'Incomplete image copy'

1 个答案:

答案 0 :(得分:1)

您应该在可写流的finish事件的回调中将文件上传到S3。

ws.on('finish', function(){
    fs.readFile(localPath, (error, fileContent) => {
      uploadToS3(fileContent, newFileName, 'profile_pics', function (err, response) {
...

您对假设2是正确的

  
      
  1. rs.on('end'<-该文件尚未本地写入,下一个进程开始。
  2.   

其他假设是错误的。

  
      
  1. r.on('response'<-文件尚未收到,下一个进程开始。
  2.   

#1没关系。多个回调应该能够并行运行。

  
      
  1. fs.unlink(localPath <-在uploadToS3(fileContent完成之前执行。
  2.   

#3可能是错误的。我不确定uploadToS3的作用,但可能在上传完成后会调用回调,因此之后的文件为unlinked