Загрузка файла в Amazon S3 с помощью NodeJS

я столкнулся с проблемой при попытке загрузить файл на моем S3 ведро. Все работает, за исключением того, что мои параметры файла не кажутся подходящими. Я использую Amazon S3 sdk для загрузки из nodejs в s3.

Мои настройки маршрутов:

var multiparty = require('connect-multiparty'),
    multipartyMiddleware = multiparty();
app.route('/api/items/upload').post(multipartyMiddleware, items.upload);

это детали.функция upload ():

exports.upload = function(req, res) {
    var file = req.files.file;
    var s3bucket = new AWS.S3({params: {Bucket: 'mybucketname'}});
    s3bucket.createBucket(function() {
        var params = {
            Key: file.name,
            Body: file
        };
        s3bucket.upload(params, function(err, data) {
            console.log("PRINT FILE:", file);
            if (err) {
                console.log('ERROR MSG: ', err);
            } else {
                console.log('Successfully uploaded data');
            }
        });
    });
};

задание Body param к строке, как "hello" работает нормально. Согласно doc, Body param должен забрать (Буфер, Типизированный Массив, Blob, String, ReadableStream) данные объекта. однако загрузка объекта файла завершается со следующим сообщением об ошибке:

[Error: Unsupported body payload object]

это объект file:

{ fieldName: 'file',
  originalFilename: 'second_fnp.png',
  path: '/var/folders/ps/l8lvygws0w93trqz7yj1t5sr0000gn/T/26374-7ttwvc.png',
  headers: 
   { 'content-disposition': 'form-data; name="file"; filename="second_fnp.png"',
     'content-type': 'image/png' },
  ws: 
   { _writableState: 
      { highWaterMark: 16384,
        objectMode: false,
        needDrain: true,
        ending: true,
        ended: true,
        finished: true,
        decodeStrings: true,
        defaultEncoding: 'utf8',
        length: 0,
        writing: false,
        sync: false,
        bufferProcessing: false,
        onwrite: [Function],
        writecb: null,
        writelen: 0,
        buffer: [],
        errorEmitted: false },
     writable: true,
     domain: null,
     _events: { error: [Object], close: [Object] },
     _maxListeners: 10,
     path: '/var/folders/ps/l8lvygws0w93trqz7yj1t5sr0000gn/T/26374-7ttwvc.png',
     fd: null,
     flags: 'w',
     mode: 438,
     start: undefined,
     pos: undefined,
     bytesWritten: 261937,
     closed: true },
  size: 261937,
  name: 'second_fnp.png',
  type: 'image/png' }

любая помощь будет высоко оценили!

3 ответов


так что, похоже, здесь что-то не так. На основе Вашего сообщения похоже, что вы пытаетесь поддерживать загрузку файлов с помощью connect-multiparty промежуточное. Что это промежуточное программное обеспечение делает, это взять загруженный файл, записать его в локальную файловую систему, а затем установить req.files на загруженный файл(ы).

конфигурация вашего маршрута выглядит нормально, проблема, похоже, с вашим


Я нашел следующее рабочее решение::

npm install aws-sdk


после установки aws-sdk используйте следующий код, заменяющий значения там, где это необходимо.

var AWS = require('aws-sdk');
var fs =  require('fs');

var s3 = new AWS.S3();

// Bucket names must be unique across all S3 users

var myBucket = 'njera';

var myKey = 'jpeg';
//for text file
//fs.readFile('demo.txt', function (err, data) {
//for Video file
//fs.readFile('demo.avi', function (err, data) {
//for image file                
fs.readFile('demo.jpg', function (err, data) {
  if (err) { throw err; }



     params = {Bucket: myBucket, Key: myKey, Body: data };

     s3.putObject(params, function(err, data) {

         if (err) {

             console.log(err)

         } else {

             console.log("Successfully uploaded data to myBucket/myKey");

         }

      });

});

Я нашел полный учебник по этому вопросу здесь, Если вы ищете ссылки ::


как загрузить файлы (текст/изображение/видео) в amazon s3 с помощью узла.js

или с помощью обещания:

const AWS = require('aws-sdk');
  AWS.config.update({
    accessKeyId: 'accessKeyId',
    secretAccessKey: 'secretAccessKey',
    region: 'region'
  });

let params = {
        Bucket: "yourBucketName",
        Key: 'someUniqueKey',
        Body: 'someFile'
      };
      try {
        let uploadPromise = await new AWS.S3().putObject(params).promise();
        console.log("Successfully uploaded data to bucket");
      } catch (e) {
        console.log("Error uploading data: ", e);
      }