【Python】Django中关于返回文件流,根据文件类型自动生成后缀,以及消除django upload上传同名文件自带后缀

后端功能
def download(request):
 url = request.GET.get('url')  #此处是前端传过来想要访问资源的地址 127.0.0.1:8000/.../文件名.zip
 url = url.split("8000")
 url = url[1].replace("/","\\") #此处是open功能打开文件的地址
 filetype = url.split(".")
 filetype = '.' + filetype[len(filetype) - 1]  # 此处结果为.zip
 filename = url.split("\\")
 filename = filename[len(filename) - 1].split(filetype)[0].split('_')[0] #此处结果为 文件名
 path = '.' + url #此处是将文件路径修改为open功能打开文件的相对路径,根据个人项目文件位置修改
 
 response = StreamingHttpResponse(path)
 response['Content-Type'] = 'application/octet-stream'
 response['Content-Disposition'] = 'attachment;filename={file_name}{format}'.format(file_name=filename,format=filetype) #设置文件名及后缀
 return response
 
 

2022/03/25更新:
问题: 部署到windows server2016 出现问题,前端获取不到后端添加在response里的Content-Disposition,导致下载文件不成功

前端代码
let _fileName = res.headers['content-disposition'].split(';')[1].split('=')[1];

解决方法:

在原后端代码的基础上,添加一行
response["Access-Control-Expose-Headers"] = 'Content-Disposition'
return response

版权声明:本文为Canon_LZ原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。