【项目实训】关于python文件上传数据库与下载出现乱码问题

关于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芜湖大司码丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值