6

我怎样才能有一个带有 FileField 的表单,其中不会保存上传的文件,而是提取并显示其文本内容?

4

1 回答 1

12

文档:http ://docs.djangoproject.com/en/dev/topics/http/file-uploads/

精简版:

  1. 您的上传表单需要有一个forms.FileField字段。
  2. 提交表单后,它会转到一个 URL,该 URL 会转到您编写的视图函数。该视图函数需要一个HttpRequest(通常命名为request)。
  3. request.FILES[].

例如,如果您的表单具有:

upFile = forms.FileField

然后您的视图可以通过以下方式访问文件:

def uploadView(request):
    upFile = request.FILES["upFile"]

whereupFile是一个UploadedFile对象,它不是类文件对象。AnUploadedFile具有以下性质:

  • 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 的文本。

编辑:嗯,当我写我的答案时,你的问题完全改变了。因此,说明如何将文件内容放在页面中,并假设文件不超过 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'),
    # ...
)
于 2010-04-26T13:41:57.620 回答