如何使用 django (python) 和 s3 上传文件?

Posted

技术标签:

【中文标题】如何使用 django (python) 和 s3 上传文件?【英文标题】:How to upload a file with django (python) and s3? 【发布时间】:2010-09-24 02:40:15 【问题描述】:

我正在寻找一种将文件上传到 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

我真的不明白我做错了什么。有人能指出我正确的方向吗?

编辑:以防万一有人想知道,我计划在实际上传工作后添加一些验证。

【问题讨论】:

【参考方案1】:

你必须为 FORM 元素提供 enctype 属性(我以前被这个咬过)。例如,您的 FORM 标记应如下所示:

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

没有 enctype,你会发现自己的 request.FILES 是空的。

【讨论】:

【参考方案2】:

我不会手动执行此操作,而是看一下 David Larlet 为 Django 编写的存储后端,django-storages

【讨论】:

【参考方案3】:

添加 enctype="multipart/form-data" 似乎在 django 文档 (http://docs.djangoproject.com/en/dev/topics/http/file-uploads/) 的“文件上传”部分中值得一提。想法?

【讨论】:

以上是关于如何使用 django (python) 和 s3 上传文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 和 aws s3 在点击时强制下载图像

python 使用django存储将下载头(Content-Disposition)添加到存储在s3中的文件

Django使用S3服务

如何使用默认文件存储(S3)通过 Django FormTools 表单向导上传文件?

Django + Heroku + S3

是否有适用于 Amazon S3 的 Python3 兼容 Django 存储后端?