Загрузка файла в Amazon S3 с помощью NodeJS
я столкнулся с проблемой при попытке загрузить файл на моем S3 ведро. Все работает, за исключением того, что мои параметры файла не кажутся подходящими. Я использую Amazon S3 sdk для загрузки из nodejs в s3.
Мои настройки маршрутов:
var multiparty = require('connect-multiparty'),
multipartyMiddleware = multiparty();
app.route('/api/items/upload').post(multipartyMiddleware, items.upload);
это детали.функция upload ():
exports.upload = function(req, res) {
var file = req.files.file;
var s3bucket = new AWS.S3({params: {Bucket: 'mybucketname'}});
s3bucket.createBucket(function() {
var params = {
Key: file.name,
Body: file
};
s3bucket.upload(params, function(err, data) {
console.log("PRINT FILE:", file);
if (err) {
console.log('ERROR MSG: ', err);
} else {
console.log('Successfully uploaded data');
}
});
});
};
задание Body
param к строке, как "hello"
работает нормально. Согласно doc, Body
param должен забрать (Буфер, Типизированный Массив, Blob, String, ReadableStream) данные объекта. однако загрузка объекта файла завершается со следующим сообщением об ошибке:
[Error: Unsupported body payload object]
это объект file:
{ fieldName: 'file',
originalFilename: 'second_fnp.png',
path: '/var/folders/ps/l8lvygws0w93trqz7yj1t5sr0000gn/T/26374-7ttwvc.png',
headers:
{ 'content-disposition': 'form-data; name="file"; filename="second_fnp.png"',
'content-type': 'image/png' },
ws:
{ _writableState:
{ highWaterMark: 16384,
objectMode: false,
needDrain: true,
ending: true,
ended: true,
finished: true,
decodeStrings: true,
defaultEncoding: 'utf8',
length: 0,
writing: false,
sync: false,
bufferProcessing: false,
onwrite: [Function],
writecb: null,
writelen: 0,
buffer: [],
errorEmitted: false },
writable: true,
domain: null,
_events: { error: [Object], close: [Object] },
_maxListeners: 10,
path: '/var/folders/ps/l8lvygws0w93trqz7yj1t5sr0000gn/T/26374-7ttwvc.png',
fd: null,
flags: 'w',
mode: 438,
start: undefined,
pos: undefined,
bytesWritten: 261937,
closed: true },
size: 261937,
name: 'second_fnp.png',
type: 'image/png' }
любая помощь будет высоко оценили!
3 ответов
так что, похоже, здесь что-то не так. На основе Вашего сообщения похоже, что вы пытаетесь поддерживать загрузку файлов с помощью connect-multiparty
промежуточное. Что это промежуточное программное обеспечение делает, это взять загруженный файл, записать его в локальную файловую систему, а затем установить req.files
на загруженный файл(ы).
конфигурация вашего маршрута выглядит нормально, проблема, похоже, с вашим
Я нашел следующее рабочее решение::
npm install aws-sdk
после установки aws-sdk используйте следующий код, заменяющий значения там, где это необходимо.
var AWS = require('aws-sdk');
var fs = require('fs');
var s3 = new AWS.S3();
// Bucket names must be unique across all S3 users
var myBucket = 'njera';
var myKey = 'jpeg';
//for text file
//fs.readFile('demo.txt', function (err, data) {
//for Video file
//fs.readFile('demo.avi', function (err, data) {
//for image file
fs.readFile('demo.jpg', function (err, data) {
if (err) { throw err; }
params = {Bucket: myBucket, Key: myKey, Body: data };
s3.putObject(params, function(err, data) {
if (err) {
console.log(err)
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});
});
Я нашел полный учебник по этому вопросу здесь, Если вы ищете ссылки ::
как загрузить файлы (текст/изображение/видео) в amazon s3 с помощью узла.js
или с помощью обещания:
const AWS = require('aws-sdk');
AWS.config.update({
accessKeyId: 'accessKeyId',
secretAccessKey: 'secretAccessKey',
region: 'region'
});
let params = {
Bucket: "yourBucketName",
Key: 'someUniqueKey',
Body: 'someFile'
};
try {
let uploadPromise = await new AWS.S3().putObject(params).promise();
console.log("Successfully uploaded data to bucket");
} catch (e) {
console.log("Error uploading data: ", e);
}