我正在尝试使用aws-sdk或knox将通过表单提交的文件直接上传到Amazon S3存储桶。表单处理非常强大。
我的问题是:如何使用这些库的最新功能来正确处理aws-sdk(或knox)的强大功能?
但是,我认为答案有点过时和/或偏离主题(例如,出于各种原因,我现在不希望使用CORS支持),和/或最重要的是,请勿参考的最新功能。要么是aws- sdk(请参阅:https : //github.com/aws/aws-sdk-js/issues/13#issuecomment-16085442)或knox(尤其是putStream()或它的可读Stream.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}
{[[RequestTimeout:在超时时间内未读取或写入您与服务器的套接字连接。空闲连接将关闭。]
消息:“在超时时间内未读取或写入您与服务器的套接字连接。空闲连接将关闭。”,代码:“ RequestTimeout”,名称:“ RequestTimeout”,statusCode:400,可重试: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 )
我还在某个地方得到了一个带有400 statusCode的大型res对象。
在两种情况下,区域均配置为 eu-west-1 。
补充笔记:
节点0.10.12 从npm(1.0.14)起最新 来自npm(1.3.1)的最新aws-sdk 来自npm的最新诺克斯(0.8.3)
节点0.10.12
从npm(1.0.14)起最新
来自npm(1.3.1)的最新aws-sdk
来自npm的最新诺克斯(0.8.3)
好吧,据Formidable的创建者说,不可能直接流到Amazon S3:
S3 API要求您在创建新文件时提供它们的大小。在完全接收多部分/表单数据文件之前,此信息不可用。这意味着流是不可能的。
实际上, form.bytesExpected 是指整个表单的大小,而不是单个文件的大小。
因此,在将数据上传到S3之前,必须先将其击中内存或服务器上的磁盘。