Загрузка файла изображения в корзину S3 не работает хорошо. Как исправить? - PullRequest
0 голосов
/ 01 июня 2019

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

В моем проекте узла используется 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.log('name :', name); //world.png
    console.log('path :', path); //C:\<my local path>\upload_d7ac6297fa2d0fb09495695f1536a41a
    console.log('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;

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

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


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

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

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

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

1 Ответ

0 голосов
/ 05 июня 2019

Вы должны использовать метод 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.log('Error happend while uploading: ', e.message)
   }
})();

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

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

...