Я настраиваю Функция загрузки 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.
Вы должны использовать метод 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()
вы можете прочитать здесь.
Я надеюсь, это поможет.