Я пытаюсь передать файл, отправленный через форму непосредственно в ведро Amazon S3, используя aws-sdk или knox. Обработка формы выполняется с помощью formidable.
Мой вопрос: как я могу правильно использовать aws-sdk (или knox), используя новейшие функции каждой из этих библиотек для обработки потоков?
Я знаю, что эта тема уже задана здесь в разных вариантах, например:
- Как получить загруженный файл, используя node.js грозную библиотеку и сохранить ее в Amazon S3 с помощью knox?
- node загрузка файла потока приложений непосредственно на amazon s3
- Доступ к необработанному файловому потоку из node -образуемой загрузки файла (и его очень полезный принятый ответ об переопределении form.onPart())
После нескольких часов борьбы я пришел к выводу, что мне нужна помощь (отказ от ответственности: я довольно новичок с потоками).
HTML-форма:
<form action="/uploadPicture" method="post" enctype="multipart/form-data">
<input name="picture" type="file" accept="image/*">
<input type="submit">
</form>
Express bodyParser middleware настраивается следующим образом:
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: ваше сокетное соединение с сервером не было прочитано или записано в течение периода ожидания. Недействительные соединения будут закрыты.]
message: "Ваше сокетное соединение с сервером не было прочитано или записано в течение периода ожидания. Недействующие соединения будут закрыты. ', код:" RequestTimeout", name: 'RequestTimeout', statusCode: 400, retryable: false}
Версия knox для функции 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
)
Я также получаю большой объект res с 400 statusCode где-то.
В обоих случаях регион настроен на eu-west-1.
Дополнительные примечания:
node 0,10.12
последний грозный от npm (1.0.14)
последний aws-sdk из npm (1.3.1)
последний нокс от npm (0.8.3)