Загрузите изображение в Amazon S3 API с помощью Node.js - PullRequest
0 голосов
/ 16 марта 2019

Я создаю приложение, которое будет обращаться к камере телефона из браузера.Позвольте пользователю сделать снимок, а затем сохраните его в корзину Amazon S3.У меня возникли проблемы с успешной публикацией API.Возвращаемое сообщение об ошибке - просто копия очень длинного тела, которое я отправляю.

Вот мой код на стороне сервера

const fs = require('fs');
const express = require('express');
const pool = require('../modules/pool');
const router = express.Router();
const { rejectUnauthenticated } = require('../modules/authentication-middleware');
const aws = require('aws-sdk');

const s3 = new aws.S3();

aws.config.update({
    accessKeyId: 'Access_KeyID',
    secretAccessKey: 'Access_Key',
    region: 'us-east-2',
});

//POST request to Amazon API
router.post('/', (req,res)=>{
    let pic = req.body.picture[0]
    console.log(pic)
    let params = {
        Bucket: 'beerphoto',
        Key: req.body.filename,
        Body : fs.createReadStream(pic),
        ContentType: 'image/png',
        Expires: 60,
    }
    s3.upload(params, function(err,data){
        if(err) {
            console.log('err')
        }
        if (data) {
            console.log("Uploaded in:", data.Location);
          }
    })

})

module.exports = router;

Мне интересно, связана ли проблема сданные изображения.Вот то, что передается в тело,

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASQA"

Фактическая строка намного, намного, длиннее (около 26 000 символов).Любая помощь будет оценена.

1 Ответ

1 голос
/ 16 марта 2019

Использование fs.createReadStream() не ваш выбор.Этот метод создает поток для данных из локальной файловой системы.Тем не менее, у вас уже есть изображение в ОЗУ, у вас даже есть ссылка на него с req.body.picture[0].Я думаю, что вообще не нужно использовать потоки, просто используйте строку base64 или, возможно, конвертируйте в экземпляр Buffer, в соответствии с документами .

Кроме того, вы упомянули, что ваши изображения в base64 являютсяоколо 26000 символов, что по крайней мере 52 кбит в UTF-8.Представьте себе высокую нагрузку на ваш сервер с 1000 запросов с большими изображениями, ваш процесс может не хватить памяти, потому что изображения слишком велики, чтобы поместиться в нем.Чтобы избежать этого, вы можете разрешить своим клиентам (не серверам) загружать на S3 напрямую и безопасно (без предоставления секретных ключей) с подписанными URL-адресами .

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