Django实现任意文件上传(最简单的方法)

青禾
青禾
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何在Django中不使用forms和models实现任意格式文件的上传保存。重点讲解HTML表单enctype设置、视图函数中通过request.FILES获取文件对象,以及利用myFile.chunks()分块写入硬盘以支持大文件上传的具体代码与原理。

Django文件上传概述

使用Django将文件上传并保存至指定路径的操作并不复杂,整个过程无需依赖Django的forms模块,也不需要定义models,即可直接完成。以下将逐步展示具体实现过程。

前端表单配置

第一步:在HTML模板中构建表单。需注意,包含文件上传功能的表单必须将method属性设置为post,同时必须指定enctype为"multipart/form-data",以确保文件数据不被编码。具体代码示例如下:


<form enctype="multipart/form-data" action="/uploadFile/" method="post">
  <input type="file" name="myfile" />
  <br/>
  <input type="submit" value="upload"/>
</form>

URL路由配置

第二步:配置urls.py文件,将对应的URL路径映射到处理文件上传的视图函数。

视图函数实现与解析

第三步:核心逻辑在视图函数中实现。以下是完整代码,该方案支持任何格式文件的上传:


def upload_file(request): 
  if request.method == "POST":  # 请求方法为POST时,进行处理 
    myFile =request.FILES.get("myfile", None)  # 获取上传的文件,如果没有文件,则默认为None 
    if not myFile: 
      returnHttpResponse("no files for upload!") 
    destination = open(os.path.join("E:\\upload",myFile.name),'wb+')  # 打开特定的文件进行二进制的写操作 
    for chunk in myFile.chunks():   # 分块写入文件 
      destination.write(chunk) 
    destination.close() 
    returnHttpResponse("upload over!") 

上述即为全部相关代码。

接下来对视图函数中的关键代码进行详细解析:

首先,尽管文件是通过POST请求提交的,但不能通过request.POST["myfile"]或request.POST.get("myfile", None)来获取。正确的获取方式是利用另一个特定的请求属性,具体做法如下:


request.FILES["myfile"]或者request.FILES.get("myfile", None)

上传的文件实际存储在FILES字典中。为了验证这一点,可以在if request.method =="POST"判断语句前添加assert False语句并运行浏览器,即可观察到FILES中的内容。

随后,需要判断用户是否实际上传了文件。如果用户仅点击了upload按钮而未选择文件,系统应提示未上传文件。

接下来是最关键的部分:此时文件数据仍位于内存中,尚未写入硬盘。因此,下一步操作是将内存中的文件数据持久化到硬盘指定位置。此前查阅许多博客发现描述模糊,导致理解困难,此处将清晰阐述具体实现方法。

文件上传的本质是将本地文件的数据写入服务器指定的文件中。无论底层是txt还是exe文件,数据均以二进制形式存在。因此,只需将已上传文件的数据以二进制方式写入服务器指定路径的文件中,该文件名可自由定义。

例如,可以将上传的123.exe文件保存为abc.txt,但这并无实际意义。对于上传的123.exe,在服务器上最好保持原名123.exe。实际上,abc.txt与123.exe的内容完全一致,只需将abc.txt的后缀名改为exe即可。

在进一步解释代码前,需先了解几个关于文件上传处理的方法和属性:

myFile.read():用于读取整个上传文件的数据,此方法仅适用于小文件;

myFile.chunks():按块返回文件数据,通过在for循环中迭代,可将大文件分块写入服务器;

myFile.multiple_chunks():根据文件大小返回True或False。当文件大小超过2.5M(默认阈值,可调整)时返回True,否则返回False。可根据此方法选择使用read()读取还是chunks()分块写入:


if myFile.multiple_chunks() == False:
  # 使用myFile.read()
 else:
  # 使用myFile.chunks()

myFile.name:这是一个属性而非方法,用于获取上传文件的文件名,包含后缀,例如123.exe;

myFile.size:这也是一个属性,用于获取上传文件的大小。

接下来的一行代码涉及:


destination = open(os.path.join("E:\\upload",myFile.name), 'wb+')

该行代码需导入os模块,即import os。对于os.path.join("E:\\upload", myFile.name),若上传文件为123.exe,则生成的路径为E:\\upload\\123.exe,并以二进制写模式打开该文件。随后进行分块数据写入:


for chunk in myFile.chunks():   # 分块写入文件
 
  destination.write(chunk)

数据写入完成后,调用destination.close()关闭文件即可。

上传效果验证

首先进行文件选择:

点击upload按钮后,页面显示upload over!提示。

检查指定目录下是否生成了相应的上传文件:

至此,关于Django实现任意文件上传(最简单的方法)的介绍结束,更多相关Django 任意文件上传内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表