出于可靠性方面的考虑,我将一些图像从外部源传输到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
完成之前执行。
答案 0 :(得分:1)
您应该在可写流的finish事件的回调中将文件上传到S3。
ws.on('finish', function(){
fs.readFile(localPath, (error, fileContent) => {
uploadToS3(fileContent, newFileName, 'profile_pics', function (err, response) {
...
您对假设2是正确的
- rs.on('end'<-该文件尚未本地写入,下一个进程开始。
其他假设是错误的。
- r.on('response'<-文件尚未收到,下一个进程开始。
#1没关系。多个回调应该能够并行运行。
- fs.unlink(localPath <-在uploadToS3(fileContent完成之前执行。
#3可能是错误的。我不确定uploadToS3
的作用,但可能在上传完成后会调用回调,因此之后的文件为unlinked