1. 程式人生 > >在python web開發中的文件上傳與下載

在python web開發中的文件上傳與下載

iterator makedirs pat type med code 獲取 保存 media

django 框架下 實現服務端的文件上傳與下載:

import json
import os
import uuid

def attachment_upload(request):
"""文件上傳"""
ret = {"status": False, "data": {"path": "", "name": ""}, "summary": ""}
target ="media/upload/avatar" # 文件保存路徑
try:
# 獲取文件對象
file_obj = request.FILES.get("file")
raw_name = file_obj.name
if not file_obj:
pass
else:
# 檢查目錄存不存在,如果不存在新建一個
if not os.path.exists(os.path.dirname(target)):
os.makedirs(target)
file_name = str(uuid.uuid4())
file_path = os.path.join(target, file_name)
with open(file_path, "wb") as f:
for chunk in file_obj.chunks(): # chuck是分塊寫入文件 (.chunks()上循環而不是用read()保證大文件不會大量使用你的系統內存。)
f.write(chunk)
ret["status"] = True
ret["data"][‘path‘] = file_path
ret["data"][‘name‘] = raw_name
except Exception as e:
ret["summary"] = str(e)
return HttpResponse(json.dumps(ret))


def attachment_download(request):
"""文件下載"""
name = request.GET.get("name", None)
file_path = request.GET[‘url‘]
def file_iterator(file_path, chunk_size=512):
with open(file_path, ‘rb‘) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
response = StreamingHttpResponse(file_iterator(file_path))
response[‘Content-Type‘] = ‘application/octet-stream‘
response[‘Content-Disposition‘] = ‘attachment;filename="{0}"‘.format(name.encode(‘utf-8‘).decode(‘ISO-8859-1‘))
return response

在python web開發中的文件上傳與下載