Загрузка файла изображения в корзину s3 не работает. Как исправить?

Я настраиваю Функция загрузки S3 с помощью koa(& serverless). Я сделал функцию загрузки S3, и она работает. Но у него был сломанный (? или пустой) в корзине s3. так. сломанное изображение

В моем проекте node используется koa с бессерверной обработкой (настройка корзины выполнена здесь).

Это мой package.json

{
// ...

  "dependencies": {
    "aws-sdk": "^2.464.0",
    "dotenv": "^8.0.0",
    "joi": "^14.3.1",
    "koa": "^2.7.0",
    "koa-body": "^4.1.0",
    "koa-router": "^7.4.0",
    "promise-mysql": "^3.3.2",
    "serverless-http": "^2.0.2",
    "serverless-offline": "^4.10.6"
  },

// ...
}

А это мой app.js

const Koa = require('koa');
const koaBody = require('koa-body');
const routes = require('./api/index');


const app = new Koa();
app.use(koaBody({ multipart: true }));
app.use(routes.routes()).use(routes.allowedMethods());

app.use(ctx => {
    ctx.body = 'hello world';
});
module.exports = app;

это мой роутер

const Router = require('koa-router');
const auth = new Router();

const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const fs = require('fs');

const BUCKET = 'chacha-s3-test';

auth.post('/image-up', async(ctx)=> {
    const image = ctx.request.files.image;

    const {
        name, path, type
    } = image

    console.info('name :', name); //world.png
    console.info('path :', path); //C:\<my local path>\upload_d7ac6297fa2d0fb09495695f1536a41a
    console.info('type :', type); //image/png

    const { key, url } = await putS3Object(
        name,
        path,
        type,
    ).then(()=> getSignedUrl(name));
    ctx.body = {key, url} // {}, no return..
})

function putS3Object(key, path, type) {
    const stream = fs.createReadStream(path);

    return S3.putObject({
        Body: stream,
        Bucket: BUCKET,
        ContentType: type,
        Key: key
    }).promise();
}

function getSignedUrl(key) {
    const params = {Bucket:BUCKET, Key: key};
    return S3.getSignedUrl('getObject', params);
}

module.exports = auth;

Этот код может загрузить файл. Но изображение в s3 битое. И он не возвращает URL.

Файл изображения из React FormDatae.target.files[0]Нужно ли мне писать код реакции?


Я ожидал, что загруженный файл изображения в корзину s3 покажет мне оригинал (изображение карты мира). но это просто маленький квадрат и черный фон (хотя он имеет почти такой же размер (257,9 КБ)). сломанное изображение

Нет сообщений об ошибках. И файл изображения успешно загружен. но изображение в ведре s3 битое.

Как это исправить? Пожалуйста помоги.

Спасибо. Хорошего дня!

🤔 А знаете ли вы, что...
Node.js позволяет создавать веб-приложения в реальном времени с помощью библиотеки Socket.io.


1
2 435
1

Ответ:

Решено

Вы должны использовать метод upload() вместо putObject() просто потому, что метод upload() будет принимать поток без определенной длины содержимого, а putObject() — нет. Вот как я использую его в настоящее время:

const S3Client = new AWS.S3({apiVersion: '2006-03-01'});
const fs = require('fs');

const upload = (bucket, key, readable) => {
    const params = {Bucket: bucket, Key: key, Body: readable};
    return S3Client.upload(params).promise();
};

(async () => {
   try {
    const readable = fs.createReadStream(some path here...);
    const uploaded = upload(config.destination.bucket, config.destination.key, readable);
    // Further stuff goes here....
   } catch(e) {
    console.info('Error happend while uploading: ', e.message)
   }
})();

Подробнее о методе upload() вы можете прочитать здесь.

Я надеюсь, это поможет.