使用Django显示上传文件的内容(而不是保存)

时间:2010-04-26 13:24:08

标签: django django-forms django-file-upload

我如何拥有一个带有FileField的表单,其中上传的文件将不会被保存,而是会提取并显示其文本内容?

1 个答案:

答案 0 :(得分:9)

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

简短版本:

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

    例如,如果您的表单有:

    upFile = forms.FileField
    

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

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

    其中upFileUploadedFile对象,是类似文件的对象。 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的文本。

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