1、上传
使用form-data的方式,上传文件,后端接收:
files = request.FILES.getlist("files)
for file in files:
file_name = file.name # 文件名
with open("xxxx+文件名", “wb”)as f:
# 方式1:对于不是很大的文件可以直接读取写入
# file_content = file.read()
# f.write(file_content)
# 方式2: 对于很大的文件,分次写入
for chunk in f.chunks():
f.write(chunk )
2、下载
第一种是文件真实存在时,读取文件返回
from django.http import FileRespone
from django.utils.encoding import escape_uri_path
with open("文件路径", "rb") as f:
res = FileRespone(f)
res["Content-Type"] = "application/octet-stream"
# escape_uri_path用于解决中文名称无法下载问题
res["Content-Disposition"] = "attachment; filename*=utf-8'' {}".format(escape_uri_path(file_name))
return JsonRespone(res)
第二种是没有文件,而是将字符串转为文件对象后下载
import tempfile
from django.http import FileRespone
from django.utils.encoding import escape_uri_path
# 下载文件的文件名
file_name = "文件.txt"
# 下载的内容
str = "下载文件内容".encode("utf-8")
str1 = "下载文件内容"
# 转换为文件对象,默认为wb方式打开的,所以我这里进行了编码
# 方式1 :使用 tempfile模块创建临时文件,我使用了方式1,方式2没有细测
file_like_obj = tempfile.NamedTemporaryFile()
file_like_obj.name = file_name
file_like_obj.write(str)
# 这里指针会指向最后,如果需要读文件内容需要调整文件指针
file_like_obj.seek(0)
# 方式2
# import io
# f = io.StringIo(str1)
# 将文件对象返回
res = FileRespone(file_like_obj)
res["Content-Type"] = "application/octet-stream"
# escape_uri_path用于解决中文名称无法下载问题
res["Content-Disposition"] = "attachment; filename*=utf-8'' {}".format(escape_uri_path(file_name))
# 最后关闭这个临时文件
file_like_obj.close()
return JsonRespone(res)