如何使用AWS S3中的文件发布multipart / form-data

时间:2016-05-11 13:34:53

标签: forms amazon-s3 python-requests

我有一个AWS Lambda函数来发布一个表单,其中包含从S3到HTML服务器的文件。

grep -R --files-with-matches Apples "${dir}" | while read -r file
do
  target_dir=`dirname $file`
  # do something with "$target_dir"
  echo $target_dir
done

我成功从AWS S3获取MS-Word文件中的数据并将其放入import requests url = 'http://...' # ... self.session = requests.session() # ... filename = 'mammals/aboutzebras.doc' data = { "name":"document", "method":"upload" } resource = boto3.resource('s3') objectSummary = resource.ObjectSummary('bucket', filename) body = objectSummary.get()["Body"] file_content = body.read() files = {'file': ('content', file_content, 'application/doc;charset=utf8')} page = self.session.post( url, files=files, data=data ) print("Status code = %s" % page.status_code) # >> Status code = 500 但是我需要对其进行base64编码吗? (我试过没有成功)。

file_content发送的请求对象上,我在标题requests.post中看到设置正确,Content-LengthContent-Type且设置了multipart/form-data

我对bounday的调用从我正在呼叫的服务器返回状态代码500。我的代码丢失了什么?

如果我使用HTML文档中的self.sessions.post提交url,那么我会返回<form> status_code,一切都很顺利。

1 个答案:

答案 0 :(得分:0)

对我所遵循的例子的误解:

files = {'file': ('content', file_content, 'application/doc;charset=utf8')}

'file'位置需要表单字段名称而不是'file',而'content'是文件名,而不是表单字段名称。

如,

files = {'fieldname': ('filename.ext', file_content, 'application/doc;charset=utf8')}