#node.js #amazon-s3 #koa
Вопрос:
Я загружаю изображения в корзину S3. Эти изображения сохраняются, но при загрузке или просмотре на S3 они ломаются. Однако иногда кажется, что код работает нормально. Служебная функция, которую я использую для загрузки изображения, такова:
Upload(fileName, data, s3Folder) {
let randomId = crypto.randomBytes(16).toString("hex");
AWS.config.update({ region: awsConstants.S3BUCKET.Region, accessKeyId: awsConstants.S3BUCKET.AccessKeyId, secretAccessKey: awsConstants.S3BUCKET.SecretAccessKey });
var s3 = new AWS.S3();
var imageName = randomId fileName;
//In case uploading to a specific folder
if (s3Folder) {
imageName = s3Folder '/' randomId fileName
}
var params = {
Bucket: awsConstants.S3BUCKET.BucketName,
Key: imageName,
Body: data,
ContentType: mime.lookup(fileName)
};
return new Promise((resolve, reject) => {
s3.putObject(params, function (err, data) {
if (err) {
console.log('Error: ', err);
reject(new Error(err.message));
} else {
resolve({
response: data,
uploadedFileName: imageName
});
}
});
});
}
Код контроллера, вызывающий эту утилиту:
async uploadImage(ctx) {
try {
var file = ctx.request.file;
if (file) {
const fileData = ctx.request.file.buffer;//Do get buffer
//const fileData = ctx.request.file.buffer.toString('binary'); tried this as well
//Utility code that uploads image
var resp = await s3Hander.Upload(file.originalname, fileData, "Profile");
if (resp amp;amp; resp["response"]["ETag"]) {
ctx.status = httpConstants.HTTP_SUCCESS_OK;
ctx.body = { response: resp, S3Data: {} };
}
else {
ctx.status = httpConstants.HTTP_INTERNAL_SERVER_ERROR;
ctx.body = { response: 'Unable to upload image!' };
}
}
else {
ctx.status = httpConstants.HTTP_BAD_REQUEST;
ctx.body = { response: 'File not found!' };
}
} catch (error) {
ctx.status = httpConstants.HTTP_INTERNAL_SERVER_ERROR;
ctx.body = { response: 'Unable to upload image!' };
}
}
Я почти уверен, что данные, которые я храню на S3, имеют некоторые проблемы, поскольку их нельзя просматривать из корзины, а также из консоли AWS. Здесь что-то не так? Я использую KOA в качестве промежуточного программного обеспечения
const multer = require('@koa/multer');
const upload = multer();
Router:
applicationRouterManager.post('/uploadImage', upload.single('avatar'), ProfileController.uploadImage);