关于python文件上传数据库与下载出现乱码问题
概述
在我们的项目中,发起任务的用户需要将模型架构文件上传到数据库(此功能已实现),而其他用户如需要加入任务则需要对创建者所上传的python文件(模型架构)进行下载,所以此次对下载的接口的实现与遇到的问题和改进进行叙述。
原代码
下面的代码是最初的实现,大概逻辑就是先使用django操作数据库表得到对应任务id的py文件的字节流,然后创建并找到一个downloads文件夹,根据任务id作为文件名创建py文件并将字节流写入,最后通过FileResponse返还给前端进行下载。
@require_http_methods(["POST"])
def downloadPythonFile(request):
# try:
mission_id = request.POST.get("mission_id")
result = Mission.objects.get(mission_id=mission_id)
fileBytes = result.python_file
mkdir("rear_core/downloads")
file_path = 'rear_core/downloads/model' + mission_id + '.py'
with open(file_path, "wb") as f2:
f2.write(d.encode())
response = FileResponse(open(file_path, 'rb'))
response['content_type'] = "application/octet-stream"
response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(file_path)
return response
遇到问题
在从数据库取出来以后,原本的字节流会加一层字符串的转换,比如b‘Hello World’,取出来就变成了b‘b\‘Hello World\’’,如此一来我们的文件就被扰乱了,所以在此问题的基础上需要对我们的代码进行修改。
改进代码
对从数据库中取出来的字节流进行处理,首先是截取首位的b’和‘,再者是对转义符进行一个缩略,最终下面的代码解决了问题(前提是py文件中不能出现中文注释或变量名,这一点可以对用户进行提示)。
@require_http_methods(["POST"])
def downloadPythonFile(request):
mission_id = request.POST.get("mission_id")
result = Mission.objects.get(mission_id=mission_id)
fileBytes = result.python_file
#对字节流进行处理
c = fileBytes[2:-1] #对字节流进行截取
cc = c.decode()
ccc = repr(cc)
cd = ccc.replace('\\\\\\', '\\') #将三连转义符替换为单个
cccc = cd.replace('\\\\', '\\') #再将双转义符替换为单个
mkdir("rear_core/downloads")
file_path = 'rear_core/downloads/model' + mission_id + '.py'
with open(file_path, "wb") as f2:
f2.write(d.encode())
response = FileResponse(open(file_path, 'rb'))
response['content_type'] = "application/octet-stream"
response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(file_path)
return response