如何使用Django(Python)和S3上传文件?

12 投票
3 回答
9875 浏览
提问于 2025-04-11 19:18

我想找个方法把文件上传到s3。我在用django。现在我使用的是亚马逊的python库来上传,代码如下:

视图:

def submitpicture(request):
    fuser = request.session["login"]

    copied_data = request.POST.copy()
    copied_data.update(request.FILES)
    content_type = copied_data['file'].get('content-type')
    ffile = copied_data['file']['content']
    key = '%s-%s' % (fuser, ''.join(copied_data['file']['filename'].split(' ')))
    site_s3.save_s3_data(key, ffile, content_type)

模板:

<form action="/submitpicture/" method="POST">
    <input type="file" id="file" name="file" />
    <input type="submit" value="submit" />
</form>

不过,当我实际运行的时候,出现了以下错误:

"Key 'file' not found in <QueryDict: {}>"
#MultiValueDictKeyError

我真的不知道自己哪里出错了。有没有人能给我指个方向?

补充:如果有人好奇,我打算在上传成功后加一些验证。

3 个回答

2

在Django文档的“文件上传”部分,提到添加 enctype="multipart/form-data" 这个设置似乎很重要。你怎么看?(可以参考这个链接了解更多:http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

5

与其手动去做这些事情,不如看看David Larlet为Django写的存储后端,叫做 django-storages

19

你需要在FORM元素中提供enctype属性(我之前就因为这个吃过亏)。比如,你的FORM标签应该像这样:

<form action="/submitpicture/" method="POST" enctype="multipart/form-data" >

如果没有enctype,你会发现request.FILES是空的。

撰写回答