aws-sdkまたはknoxを使用して、フォームから送信されたファイルを直接 Amazon S3 バケットにストリーミング アップロードしようとしています。フォーム処理はformidableで行います。
私の質問は、ストリームを処理するためにこれらの各ライブラリの最新機能を使用して、aws-sdk (または knox) で formidable を適切に使用するにはどうすればよいですか?
このトピックは、ここでさまざまな形ですでに質問されていることを認識しています。
- node.js 手ごわいライブラリを使用してアップロードされたファイルを受信し、knox を使用して Amazon S3 に保存する方法は?
- ノード アプリケーション ストリーム ファイルを Amazon s3 に直接アップロード
- node-formidable ファイルのアップロードから raw ファイル ストリームにアクセスする(および form.onPart() のオーバーライドに関する非常に有用な受け入れられた回答)
ただし、回答は少し時代遅れであるか、トピックから外れていると思います(つまり、さまざまな理由で今のところ使用したくない CORS サポート)、および/または最も重要なことに、最新の機能に言及していませんaws-sdk ( https://github.com/aws/aws-sdk-js/issues/13#issuecomment-16085442を参照) または knox (特に putStream() またはその readableStream.pipe(req) バリアント) のいずれかについて説明します。ドキュメントで)。
何時間も格闘した後、助けが必要だという結論に達しました (免責事項: 私はストリームの初心者です)。
HTML フォーム:
<form action="/uploadPicture" method="post" enctype="multipart/form-data">
<input name="picture" type="file" accept="image/*">
<input type="submit">
</form>
Express 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: サーバーへのソケット接続が、タイムアウト時間内に読み取られなかったか、書き込まれませんでした。アイドル状態の接続は閉じられます。]
メッセージ: 'サーバーへのソケット接続は、タイムアウト期間内に読み書きされませんでした。アイドル状態の接続は閉じられます。'、コード: 'RequestTimeout'、名前: 'RequestTimeout'、statusCode: 400、再試行可能: false }
このように調整された handlePart() 関数の knox バージョンも惨めに失敗します。
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 を持つ大きな res オブジェクトを取得します。
どちらの場合も、リージョンはeu-west-1に設定されています。
その他の注意事項:
ノード 0.10.12
npm(1.0.14)からの最新の手ごわい
npm (1.3.1) からの最新の aws-sdk
npm からの最新の knox (0.8.3)