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

Posted

技术标签:

【中文标题】使用 Django 显示上传文件的内容(而不是保存)【英文标题】:Displaying the contents (rather than saving) of an uploaded file with Django 【发布时间】:2011-02-12 09:54:16 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

短版:

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

例如,如果您的表单有:

upFile = forms.FileField

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

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

其中upFileUploadedFile 对象,它不是 类文件对象。 UploadedFile 具有以下属性:

name: 上传文件名 size: 字节大小

还有以下方法:

read():读取整个文件并以字符串形式返回。可能对您有好处,但不建议用于超过 2.5 MB 的文件。 multiple_chunks():如果文件应作为多个块处理,则返回 Truechunks():返回一个生成器(像迭代器一样使用它),它一次返回一个块的文件数据。

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

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'),
    # ...
)

【讨论】:

您能在&lt;form&gt; 标签上添加一些关于enctype 的内容吗?拯救遇到麻烦的 OP! @Mike D. - 我重写了这个问题 - 我没有认为我改变了意思,只是希望它更容易解析。 就像许多项目一样,它开始时很小......但逐渐壮大...... ;_;与我在第一行引用的网页相比,它仍然很短。 如果文件是图像怎么办?我会将上下文对象设置为什么,以便我可以指定 标记的 src 属性?

以上是关于使用 Django 显示上传文件的内容(而不是保存)的主要内容,如果未能解决你的问题,请参考以下文章

文件上传保存文件夹而不是文件

Django:将用户上传保存在单独的文件夹中

Django S3 minio

Django_上传图片和模版获取图片

使用文件字段编辑 Django 模型而不重新上传文件

Django FileField 保存 url 而不是数据库中的路径