django文件上傳、下載

1、Django實現文件下載css

(1)、後臺接口html

若是從服務器直接將文件路徑傳給瀏覽器,普通文件能夠直接下載,而圖片,html,css和pdf格式等文件會直接顯示,因此解決辦法就是在頭文件中讓文件流寫入硬盤.python

①、最簡單的文件下載功能的實現,直接將文件流放入HttpResponse對象便可瀏覽器

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

這種方式簡單粗暴,適合小文件的下載,但若是這個文件很是大,這種方式會佔用大量的內存,甚至致使服務器崩潰服務器

②、更合理的文件下載app

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

③、再次優化post

上述的代碼,已經完成了將服務器上的文件,經過文件流傳輸到瀏覽器,但文件流一般會以亂碼形式顯示到瀏覽器中,而非下載到硬盤上,所以,還要在作點優化,讓文件流寫入硬盤。優化很簡單,給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)、前臺展現url

①、使用a標籤直接訪問到上面的視圖函數配置好的url便可

②、使用button,或者其餘標籤

使用js觸發點擊事件,代碼以下:

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

2、 文件上傳

(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>)
相關文章
相關標籤/搜索