gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:05:34 30 4
gpt4 key购买 nike

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

最佳答案

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

简短版本:

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

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

upFile = forms.FileField

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

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

其中 upFile 是一个 UploadedFile 对象,它不是一个类似文件的对象。 UploadedFile 具有以下属性:

  • name:上传文件的名称
  • 大小:大小(以字节为单位)

以及以下方法:

  • read():读取整个文件并以字符串形式返回。可能适合您,但不建议用于超过 2.5 MB 的文件。
  • multiple_chunks():如果文件应作为多个 block 处理,则返回 True
  • chunks():返回一个生成器(将其用作迭代器),该生成器一次返回一个 block 的文件数据。

所以,继续这个例子,如果你只是想将文件保存到磁盘,你可以写:

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,您的 View 函数可能如下所示:

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)

当然,添加您需要的任何其他 View 处理。

那么你的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 block :

<form method="post" action="{% url uploadFile %}" enctype="multipart/form-data">
{{ form }}
</form>

注意:{% url ___ %} 命令将输入​​ View 的 URL 或命名 URL。该参数可以是 urls.py 文件中使用的 View 函数的名称,也可以是为 url 对象指定的名称,如下所示:

urlpatterns = patterns('',
url('^uploadform$', 'myapp.views.uploadFormView', name='uploadForm'),
url('^upload$', 'myapp.views.uploadView', name='uploadFile'),
# ...
)

关于django - 使用 Django 显示上传文件的内容(而不是保存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2713735/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com