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

本文详细介绍如何使用Django框架实现文件上传功能,无需forms或models,直接在HTML表单和视图函数中操作。文章讲解了POST请求、FILES字典、文件读取与写入等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

原文链接 ?
原文作者信息

实操

利用Django实现文件上传并且保存到指定路径下,其实并不困难,完全不需要用到django的forms,也不需要django的models,就可以实现,下面开始实现。

HTML 模板

第一步:在模板文件中,创建一个form表单,需要特别注意的是,在有文件上传的form表单中,method属性必须为post,而且必须指定它的enctype为"multipart/form-data",表明不对字符进行编码,具体的代码如下:

	<form enctype="multipart/form-data"
	      action="/basic/uploadFile/" method="POST">

		<input type="file" name="upload_file">
		<br/>
		<input type="submit" name="btn_upload">
        
        {% csrf_token %}
	</form>

django URL 路由

第二步:设置urls.py文件,指定相应的视图函数进行处理

urlpatterns = [
    path("", views.index, name="index"),
    path("uploadFile/", views.upload, name='upload'),
]

保存 POST 文件

第三步:最重要的,在视图函数中做处理,先把代码贴出来,一共就这么点,可以实现任何格式文件的上传

[...]
from django.http import HttpResponse
from django.shortcuts import redirect
import os

[...]

def upload(request):
    if request.method == "POST":
        myFile = request.FILES.get('upload_file', None)
        if not myFile:
            return redirect("/basic/")  # home page should with error
        destination = open(
            os.path.join("E:\\tmp", myFile.name), 'wb+')

        for chunk in myFile.chunks():
            destination.write(chunk)
        destination.close()
        return HttpResponse("<h1>Upload finished!</h1>")

    else:
        return redirect("/basic/")

代码就是上面这些。

解释

这里需要对上面视图函数中的代码进行详细的解释一番:

首先,对于上传的文件,虽然是通过POST的方式上传的,但是不能通过request.POST[“upload_file”]或者request.POST.get(“upload_file”, None),这两种方式来访问,这里需要使用另外一种方式,就是:

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

因为上传的文件是保存在FILES这个字典中的,可以在if request.method =="POST"之前加上一句assert False,再运行浏览器,就可以看到结果。

接下来,需要判断用户是不是真的上传了文件,如果用户仅仅只是点了 一下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():这个方法根据myFile的大小,返回True或者False,当myFile文件大于2.5M(默认为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:\\tmp",myFile.name), 'wb+')

这一行代码需要用到os模块,import os。对于os.path.join(“E:\tmp”, myFile.name),如果上传的文件为123.exe,那么将得到E:\tmp\123.exe这个路径,以写二进制的方式打开这个文件。接下来是分块写入数据:

        for chunk in myFile.chunks():
            destination.write(chunk)

数据写完之后关闭文件就可以了,destination.close()

测试

首先选择文件:

在这里插入图片描述

点击upload,显示upload finished!

在这里插入图片描述

查看指定目录下是否有相应的上传文件:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值