如何从url将文件流式传输到s3

时间:2015-09-13 06:20:22

标签: javascript node.js amazon-s3

如何从网址抓取文件然后上传到s3?有很多使用Multipart Upload的例子,但这应该更简单。这个代码执行服务器端。 S3上传失败,出现' NetworkingError:无法管道。不可读。'

import http from 'http';
import fs from 'fs';
import AWS from 'aws-sdk';
AWS.config.region = 'us-west-1';

const file = fs.createWriteStream('file.jpg');
var request = http.get('http://weknowmemes.com/wp-content/uploads/2012/04/dont-worry-cat-it.jpg', function(response) {
  response.pipe(file);

  file.on('finish', function() {
    // Upload the File
    var s3 = new AWS.S3({params: {Bucket: Config.s3Bucket}});
    var params = {Key: 'mykey', ContentType: 'image/jpg', Body: file};
    s3.putObject(params, function (err, data) {
      console.log('err', err)
      console.log('data', data)
    });
  });
});

1 个答案:

答案 0 :(得分:0)

好吧我解决了这个问题。这是我的工作解决方案:

import request from 'request';
import bl from 'bl';
import AWS from 'aws-sdk';

const regexp = /filename=\"(.*)\"/gi;
let fileName;
let mimeType;

request
  .get(imageUrl)
  .on('response', function(response) {
    fileName = regexp.exec(response.headers['content-disposition'] )[1];
    mimeType = response.headers['content-type'];
  })
  .pipe(bl(function(error, data) {
    const s3 = new AWS.S3({params: {Bucket: Config.s3Bucket}});
    const params = {Key: fileName, ContentType: mimeType, Body: data};
    s3.putObject(params, function(s3Error, data) {
      if (s3Error) {
        console.log('Error uploading data: ', s3Error);
      } else {
        console.log('Successfully uploaded data: ', data);
      }
    });
  }))

我不需要使用WriteStream实例,但我确实需要为我的图像获取原始数据二进制文件,以便分配到s3' Body的{​​{1}}参数} 方法。这需要使用BufferList即。 putObject

真的我的主要问题是没有理解如何从import bl from 'bl';向外以S3的方式正确地格式化数据。当您使用Multipart Form时,它会为您处理该文件,因此我一直在为该用例找到所有简洁的示例。

相关问题