我正在尝试使用aws-sdk或knox将通过表单提交的文件直接上传到 Amazon S3 存储桶。表单处理是用强大的完成的。
我的问题是:如何使用这些库的最新功能来处理流,如何正确使用 aws-sdk(或 knox)的强大功能?
我知道这个话题已经在这里以不同的方式提出过,即:
- 如何使用 node.js 强大的库接收上传的文件并使用 knox 将其保存到 Amazon S3?
- node应用流文件直接上传到amazon s3
- 从节点强大的文件上传访问原始文件流(及其在覆盖 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',状态码: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)