我如何拥有一个带有FileField的表单,其中上传的文件将不会被保存,而是会提取并显示其文本内容?
答案 0 :(得分:9)
文档:http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
简短版本:
forms.FileField
字段。HttpRequest
(通常名为request
)。request.FILES[]
。例如,如果您的表单有:
upFile = forms.FileField
然后您的视图可以通过以下方式访问该文件:
def uploadView(request):
upFile = request.FILES["upFile"]
其中upFile
是UploadedFile
对象,不是类似文件的对象。 UploadedFile
具有以下属性:
name
:已上传文件的名称size
:以字节为单位的大小以及以下方法:
read()
:读取整个文件并以字符串形式返回。可能对您有用,但不建议用于超过2.5 MB的文件。multiple_chunks()
:如果文件应作为多个块处理,则返回True
。chunks()
:返回一个生成器(像迭代器一样使用它),它一次返回一个块的文件数据。所以,继续这个例子,如果你只想将文件保存到磁盘,你可以写:
outFile = open("/tmp/uploadTest.txt", "w")
if not upFile.multiple_chunks():
outFile.write(upFile.read())
else:
for chunk in upFile.chunks():
outFile.write(chunk)
outFile.close()
在您的情况下,如果multiple_chunks()
返回True
,您可能只会显示错误消息并丢弃该文件,因为您可能不希望在页面上放置超过2.5 MB的文本。
def uploadView(request):
upFile = request.FILES["upFile"]
context = {}
if upFile.multiple_chunks():
context["uploadError"] = "Uploaded file is too big (%.2f MB)." % (upFile.size,)
else:
context["uploadedFile"] = upFile.read()
return render_to_response('fileUploadPage.html', context)
当然,添加您需要的任何其他视图处理。
然后你的fileUploadPage.html
模板需要有一个地方:
<div id="uploaded">
{% if uploadError %}
<span class="error">{{ uploadError }}</span>
{% else %}
{{ uploadedFile }}
{% endif %}
</div>
编辑2:多米尼克有一个好点。以下是用于设置form
标记的通用模板代码。在具有以下形式的模板中使用它:
<form method="post" action="{% url uploadFile %}"
{% if form.is_multipart %}
enctype="multipart/form-data"
{% endif %}>
{{ form }}
</form>
在您的情况下,由于您知道表单中包含文件,因此您可能会丢失if
块:
<form method="post" action="{% url uploadFile %}" enctype="multipart/form-data">
{{ form }}
</form>
注意:{% url ___ %}
命令将放入视图或命名URL的URL。该参数可以是urls.py
文件中使用的视图函数的名称,也可以是url
对象的名称,如下所示:
urlpatterns = patterns('',
url('^uploadform$', 'myapp.views.uploadFormView', name='uploadForm'),
url('^upload$', 'myapp.views.uploadView', name='uploadFile'),
# ...
)