zoukankan      html  css  js  c++  java
  • django文件上传、下载

    一、Django实现文件下载

    (1)、后台接口

    如果从服务器直接将文件路径传给浏览器,普通文件可以直接下载,而图片,html,css和pdf格式等文件会直接显示,所以解决办法就是在头文件中让文件流写入硬盘.

    ①、最简单的文件下载功能的实现,直接将文件流放入HttpResponse对象即可

    def file_download(request):
    	# do something...
    	with open('file_name.txt') as f:
    		c = f.read()
    	return HttpResponse(c)
    

    这种方式简单粗暴,适合小文件的下载,但如果这个文件非常大,这种方式会占用大量的内存,甚至导致服务器崩溃

    ②、更合理的文件下载

    DjangoHttpResponse对象运行将迭代器作为传入参数,将上面代码中的传入参数c换成一个迭代器,便可以将上述下载功能优化为对大小文件均适合;而Django更进一步,推荐使用 StreamingHttpResponse对象取代HttpResponse对象,StreamingHttpResponse对象用于将文件流发送给浏览器,与HttpResponse对象非常相似,对于文件下载功能,使用StreamingHttpResponse对象更合理。因此,更加合理的文件下载功能,应该先写一个迭代器,用于处理文件,然后将这个迭代器作为参数传递给StreamingHttpResponse对象,如:

    from `Django`.http import Streaming`HttpResponse`
      
    def big_file_download(request):
    	# do something...
      
    	def file_iterator(file_name, chunk_size=512):
    		with open(file_name) as f:
    			while True:
    				c = f.read(chunk_size)
    				if c:
    					yield c
    				else:
    					break
      
     	the_file_name = "file_name.txt"
     	response = Streaming`HttpResponse`(file_iterator(the_file_name))
      
     	return response
    

    ③、再次优化

    上述的代码,已经完成了将服务器上的文件,通过文件流传输到浏览器,但文件流通常会以乱码形式显示到浏览器中,而非下载到硬盘上,因此,还要在做点优化,让文件流写入硬盘。优化很简单,给StreamingHttpResponse对象的Content-Type和Content-Disposition字段赋下面的值即可

    from `Django`.http import Streaming`HttpResponse`
      
    def big_file_download(request):
    	# do something...
      
    	def file_iterator(file_name, chunk_size=512):
    		with open(file_name) as f:
    			while True:
    				c = f.read(chunk_size)
    				if c:
    					yield c
    				else:
    					break
      
    	the_file_name = "big_file.pdf"
    	response = Streaming`HttpResponse`(file_iterator(the_file_name))
    	response['Content-Type'] = 'application/octet-stream'
    	response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name)
      
    	return response
    

    (2)、前台展示

    ①、使用a标签直接访问到上面的视图函数配置好的url即可

    ②、使用button,或者其他标签

    使用js触发点击事件,代码如下:

    $("body").on("click",".buttonimgdown",function(){
     	alert($(".hiddenshiyan").val());
     	location.href="/downloadFile/?url=" rel="external nofollow" +$(".hiddenshiyan").val();
    });
    

    二、 文件上传

    (1)、前台表单,使用表单的方式进行文件的上传

    <form enctype="multipart/form-data" action="./upload" method="post">
    	<p>File: <input type="file" name="file"></p>
    	<p><input type="submit" value="Upload"></p>
    </form>
    

    (2)、后台接收,这是接收图片的代码,其他文件类似

    def addOnepicture(req):
    	rollpicturePath=os.path.join(basePath,rollpictureName)
    	reqfile = req.FILES['picfile']
    	img = Image.open(reqfile)
    	img.thumbnail((500,500),Image.ANTIALIAS)#对图片进行等比缩放
    	img.save(rollpicturePath,"png")#保存图片
    	T_Picture.objects.create(<u>...</u>)
    
  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/Guoxing-Z/p/12162260.html
Copyright © 2011-2022 走看看