Считайте файл из Amazon S3 с nodeJS и опубликуйте его на другом сервере с axios - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь прочитать файл (изображение) из amazon S3 и отправить его на другой сервер с multipart/form.

  let imageParams = { Bucket: 'my-bucket', Key: 'imageName.jpg' };

  let formData = new FormData();

  formData.append('file', s3.getObject(imageParams).createReadStream());

  let apiResponse = await api.post("/fileUpload", formData,
    { params: { token: process.env.API_TOKEN } }, 
    { headers: {'Content-Type': 'multipart/form-data' } } );

Но я не могу его запустить, он возвращает мне:

Error: Request failed with status code 415

может быть, я неправильно понимаю, как работает createReadStream()

1 Ответ

0 голосов
/ 20 февраля 2020

Используйте concat для передачи потока. В противном случае данные формы отправляют только первый фрагмент потока, и сервер не знает, как с ним обращаться.

Например

const axios = require('axios');
const {S3} = require('aws-sdk');
const FormData = require('form-data');
const s3 = new S3();
var concat = require('concat-stream')

const api = axios.default.create({
    baseURL: 'http://example.com',

})

const readStream = s3.getObject({Bucket: 'bucket', Key: 'file'}).createReadStream();
readStream.pipe(concat(filebuffer => {
    const formData = new FormData();
    formData.append('file', filebuffer);
    formData.getLength((err, length) => {
        console.log(length)
        const headers = formData.getHeaders({'content-length': length})
        console.log({headers})
        return api({
            method: 'post',
            url: "/upload",
            headers: headers,
            data: formData
        })
    })

}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...