gpt4 book ai didi

python - Django Boto 和上传到 S3 是一个 400 错误请求

转载 作者:行者123 更新时间:2023-12-01 06:04:59 24 4
gpt4 key购买 nike

我正在尝试使用 boto 库创建一个 super 简单的文件上传脚本,而不是任何其他库。根据我的尝试,感觉它应该有效,但事实并非如此。

我现在遇到的错误是:

S3ResponseError: 400 Bad Request

这是我认为的代码:

def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)

file = request.FILES['file']
filename = file.name

conn = boto.connect_s3()
bucket = conn.create_bucket('some-bucket-name')
from boto.s3.key import Key
k = Key(bucket)

k.key = filename
k.send_file(file)
k.content_type = mimetypes.guess_type(filename)[0]
k.set_contents_from_stream(file.chunks())
k.set_acl('public-read')

return HttpResponseRedirect('/')
else:
form = UploadFileForm()

return render_to_response('home/upload.html',
{'form':form},
context_instance=RequestContext(request))

如果我修改它以保存在本地,它就可以工作,所以上传到 s3 就被破坏了。我已经测试了 set_contents_from_string 并且它适用于字符串数据。但是,任何处理文件或流的内容都会出现上述错误。我是否缺少某个地方的设置,或者我正在做的事情完全错误?

最佳答案

我在尝试将文件传输到 S3 时遇到了这个问题。最终,我发现我必须在调用 send_file 之前设置 Key 对象的 size 属性。

k = Key(bucket)
k.key = 'some-key'
k.size = 12345
k.send_file(file)

可以使用文件上的“seek”和“tell”找到大小。下面将在保留当前文件位置的同时查找大小。在您的情况下,您可以不必记住当前位置,只需在获取文件大小后返回到零即可。

position = file.tell()
file.seek(0, os.SEEK_END)
size = file.tell()
file.seek(position)

关于python - Django Boto 和上传到 S3 是一个 400 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8571960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com