Я пытаюсь передать файл, отправленный через форму непосредственно в ведро Amazon S3, используя aws-sdk или knox. Обработка формы осуществляется с помощью formidable.Поток загрузки файла на S3 на Node.js с использованием грозного и (knox или aws-sdk)
Мой вопрос: как правильно использовать грозное с aws-sdk (или knox), используя новейшие функции каждой из этих библиотек для обработки потоков?
Я понимаю, что эта тема уже здесь просили в различных вкусов, а именно:
- How to receive an uploaded file using node.js formidable library and save it to Amazon S3 using knox?
- node application stream file upload directly to amazon s3
- Accessing the raw file stream from a node-formidable file upload (и его очень полезным общепринятый ответ на overiding form.onPart ())
Однако, я считаю, что ответы немного устарели и/или вне темы (т. Е. Поддержка CORS, которую я сейчас не хочу использовать для fo r различные причины) и/или, самое главное, не ссылаются на последние функции от aws-sdk (см.: https://github.com/aws/aws-sdk-js/issues/13#issuecomment-16085442) или knox (особенно putStream() или его readableStream.pipe (req) вариант, both explained in the doc).
После долгих боев я пришел к выводу, что мне нужна помощь (отказ от ответственности: я довольно новичок с потоками).
HTML форма:
<form action="/uploadPicture" method="post" enctype="multipart/form-data">
<input name="picture" type="file" accept="image/*">
<input type="submit">
</form>
Экспресс bodyParser промежуточного слоя настроен таким образом:
app.use(express.bodyParser({defer: true}))
POST обработчика запроса:
uploadPicture = (req, res, next) ->
form = new formidable.IncomingForm()
form.parse(req)
form.onPart = (part) ->
if not part.filename
# Let formidable handle all non-file parts (fields)
form.handlePart(part)
else
handlePart(part, form.bytesExpected)
handlePart = (part, fileSize) ->
# aws-sdk version
params =
Bucket: "mybucket"
Key: part.filename
ContentLength: fileSize
Body: part # passing stream object as body parameter
awsS3client.putObject(params, (err, data) ->
if err
console.log err
else
console.log data
)
Однако, я получаю следующее сообщение об ошибке:
{ [RequestTimeout: Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.]
message: 'Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.', code: 'RequestTimeout', name: 'RequestTimeout', statusCode: 400, retryable: false }
Нокс версия handlePart() функция с учетом так и с треском терпит неудачу:
handlePart = (part, fileSize) ->
headers =
"Content-Length": fileSize
"Content-Type": part.mime
knoxS3client.putStream(part, part.filename, headers, (err, res) ->
if err
console.log err
else
console.log res
)
Я также получить большой Рез объект с 400 StatusCode где-то.
Регион настроен на eu-west-1 в обоих случаях.
Дополнительные примечания:
node 0.10.12
latest formidable from npm (1.0.14)
latest aws-sdk from npm (1.3.1)
latest knox from npm (0.8.3)
Это просто спас меня много времени. Благодарю. –
На самом деле это не так. Можно передать/передать поток s3! вам просто нужно знать размер загрузки. Если ваш клиент может обеспечить, что тогда вы действительно можете использовать канал для загрузки на s3 без неприятного записи на жесткий диск. Я пишу cli и посреднический сервер, который будет загружаться на s3. Поскольку я контролирую как клиент, так и сервер, я могу определить размер файла перед загрузкой. Я думаю, что могут быть другие краевые дела, такие как мои, которые не должны быть уволены. Я использую knox для потоковой передачи в s3 с запросом put. – CharlesTWall3
@ CharlesTWall3 Это очень полезный комментарий, я не думал об этом в то время - я думал о решении только на стороне сервера. Не стесняйтесь публиковать ответ, если вам удастся что-то сделать, я с радостью проголосую за ваше решение. Вы также можете отредактировать этот ответ. Благодаря! – jbmusso