django实战:上传文件操作,下载文件

django上传文件

第一步:我们需要把前端的模板文件的form表单创建好

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="/upload/" method="post" enctype="multipart/form-data">
    	{% csrf_token %}
        <input type="file" name="file">
        <input type="submit" value="上传">
    </form>
</body>
</html>

注意:文件上传的form表单必须是method="POST"enctype="multipart/form-data",两者缺一不可。
第二步:设置urls.py,指定相应的视图函数来进行处理
第三步:最重要的,在视图函数中做处理,先把代码贴出来,一共就这么点,可以实现任何格式文件的上传。

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

这里需要对上面视图函数中的代码进行详细的解释一番:
首先,对于上传的文件,虽然是通过POST的方式上传的,但是不能通过request.POST["file"]或者request.POST.get("file", None),这两种方式来访问,这里需要使用另外一种方式,就是:request.FILES["file"]或者request.FILES.get("file", None),因为上传的文件是保存在FILES这个字典中的,可以在if request.method =="POST"之前加上一句assert False,再运行浏览器,就可以看到结果。
在这里插入图片描述
接下来,需要判断用户是不是真的上传了文件,如果用户仅仅只是点了 一下upload按键,那么就提示他没有上传文件。
下面是最重要的部分,现在已经得到了文件了,但是文件在内存中,没有写到硬盘里面去,接下里需要完成的就是把文件写入到硬盘。
其实上传文件,就是把硬盘里面某个文件的数据,写入到服务器指定的文件中,在最底层不管是txt文件还是exe文件等,全都是二进制的数据,这里所要做的只是将已经上传了的文件的数据,以二进制的方式写入到服务器指定的文件中,这个文件可以随意命名。
但是出于服务器环境的安全,防止被上传恶意文件控制,可以对上传的后缀名进行拦截筛选。

	if request.method == "POST": # 请求方法为POST时,进行处理
	 	myFile = request.FILES.get("file", None) # 获取上传的文件,如果没有文件,则默认为None
		excel_type = myFile.name.split('.')[1]
        if excel_type in ['xlsx','xls']:#判断后缀名是否是想要的
        	#上传文件为excel文件
        	return HttpResponse("success")
        else:
        	#上传文件为其它文件
        	return HttpResponse("请上传excel文件")

在进行进一步的代码解释之前,需要先讲几个关于上传文件的方法和属性:

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:这也是一个属性,该属性得到上传文件的大小。

django下载文件

第一步:设置urls.py,指定相应的视图函数来进行处理;
第二步:视图函数代码:

from django.http import HttpResponse,StreamingHttpResponse
from django.conf import settings
  
def download(request):
	filename = request.GET.get('file')
	filepath = os.path.join(settings.MEDIA_ROOT, filename)
	fp = open(filepath, 'rb')
	response = StreamingHttpResponse(fp)
	# response = FileResponse(fp)
	response['Content-Type'] = 'application/octet-stream'
	response['Content-Disposition'] = 'attachment;filename="%s"' % filename
	return response
	fp.close()

原理解释:
HttpResponse会直接使用迭代器对象,将迭代器对象的内容存储城字符串,然后返回给客户端,同时释放内存。可以当文件变大看出这是一个非常耗费时间和内存的过程。
而StreamingHttpResponse是将文件内容进行流式传输,StreamingHttpResponse在官方文档的解释是:

The StreamingHttpResponse class is used to stream a response from Django to the browser. You might want to do this if generating the response takes too long or uses too much memory.

这是一种非常省时省内存的方法。但是因为StreamingHttpResponse的文件传输过程持续在整个response的过程中,所以这有可能会降低服务器的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值