django分片式上传文件,位置放于服务器里面的某一个文件夹

def upload(request):
rev_file = request.FILES.get('apk')
if not rev_file:
return JsonResponse({'code':0, 'msg':'文件不存在!'})

dt_datetime = datetime.datetime.now()
str_time = dt_datetime.strftime('%Y%m%d')
print(type(str_time))
print(str_time)

new_name =   r"C" +"+" +"+"+"SDK"  + str_time
print(type(new_name))
print(new_name)


file_path = os.path.join(settings.MEDIA_ROOT, new_name + os.path.splitext(rev_file.name)[1] )
try:
    f = open(file_path,'wb')
    for i in rev_file.chunks():
        print(i)
        f.write(i)
    f.close()

    return JsonResponse({'code': 1, 'name': new_name + os.path.splitext(rev_file.name)[1]})

except Exception as e:
    return JsonResponse({'code':0, 'msg':str(e)})

要配合vue的分片上传

【以下回答由 GPT 生成】

优化建议:

  1. 引入shutil库,使用shutil.move()函数代替逐块写入文件的方式,以提高效率。
  2. 使用uuid库生成唯一的文件名,可以用于避免重复文件名的冲突。
  3. 使用os.path.join()函数代替字符串拼接路径,以保证在不同操作系统上的兼容性。
  4. 对文件路径进行合法性检查,确保上传文件存储在服务器的指定文件夹中。
  5. 使用Django的settings模块来获取配置的媒体文件路径,以增加代码的灵活性和可维护性。

下面是优化后的代码示例:

import os
import datetime
import shutil
import uuid

from django.conf import settings
from django.http import JsonResponse

def upload(request):
    rev_file = request.FILES.get('apk')
    if not rev_file:
        return JsonResponse({'code': 0, 'msg': '文件不存在!'})

    dt_datetime = datetime.datetime.now()
    str_time = dt_datetime.strftime('%Y%m%d')
    new_name = "C++" + "++" + "SDK" + str_time + str(uuid.uuid4().hex)

    file_path = os.path.join(settings.MEDIA_ROOT, new_name + os.path.splitext(rev_file.name)[1])

    try:
        with open(file_path, 'wb') as f:
            shutil.copyfileobj(rev_file, f)

        return JsonResponse({'code': 1, 'name': new_name + os.path.splitext(rev_file.name)[1]})

    except Exception as e:
        return JsonResponse({'code': 0, 'msg': str(e)})

以上是对代码的优化建议,根据具体需求和实际情况,你还可以结合其他功能进行适当的改进和完善。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^