def file_delete(request, project_id): fid = request.GET.get('fid') delete_object = models.FileRepository.objects.filter(id=int(fid), project=request.auth.project).first() if delete_object.file_type == 1: # 删除文件,返还使用空间 request.auth.project.used_space -= delete_object.file_size request.auth.project.save() # cos操作删除文件 delete_file(request.auth.project.bucket, request.auth.project.region, delete_object.key) # 数据库中删除 delete_object.delete() return JsonResponse({'status': True}) total_size = 0 key_list = [] folder_list = [delete_object, ] for folder in folder_list: child_list = models.FileRepository.objects.filter(project=request.auth.project, parent=folder).order_by( '-file_type') for child in child_list: if child.file_type == 2: folder_list.append(child) else: total_size += child.file_size key_list.append({'Key': child.key}) if key_list: delete_file_list(request.auth.project.bucket, request.auth.project.region, key_list) if total_size: request.auth.project.used_space -= total_size request.auth.project.save() delete_object.delete() return JsonResponse({'status': True})
def file_delete(request, project_id): """ 删除文件 """ fid = request.GET.get('fid') # 删除数据库中的 文件 & 文件夹 (级联删除) delete_object = models.FileRepository.objects.filter( id=fid, project=request.tracer.project).first() if delete_object.file_type == 1: # 删除文件(数据库文件删除、cos文件删除、项目已使用空间容量还回去) request.tracer.project.use_space -= delete_object.file_size request.tracer.project.save() request.tracer.project.use_space -= delete_object.file_size request.tracer.project.save() # cos中删除文件 delete_file(request.tracer.project.bucket, settings.BUCKET_REGION, delete_object.key) # 在数据库中删除当前文件 delete_object.delete() return JsonResponse({'status': True}) # 删除文件夹(找到文件夹下所有的文件->数据库文件删除、cos文件删除、项目已使用空间容量还回去) # delete_object # 找他下面的 文件和文件夹 # models.FileRepository.objects.filter(parent=delete_object) # 文件 删除;文件夹 继续向里查 total_size = 0 key_list = [] folder_list = [ delete_object, ] for folder in folder_list: child_list = models.FileRepository.objects.filter( project=request.tracer.project, parent=folder).order_by('-file_type') for child in child_list: if child.file_type == 2: folder_list.append(child) else: # 文件大小汇总 total_size += child.file_size # 删除文件 key_list.append({"Key": child.key}) # cos 批量删除文件 if key_list: delete_file_list(request.tracer.project.bucket, request.tracer.project.region, key_list) # 归还容量 if total_size: request.tracer.project.use_space -= total_size request.tracer.project.save() # 删除数据库中的文件 delete_object.delete() return JsonResponse({'status': True})
def file_delete(request, project_id): """文件&&文件夹的删除""" if request.method == "GET": # 获取文件ID fid = request.GET.get('fid', None) # 删除文件或者文件夹 delete_obj = FileRepository.objects.filter( id=fid, project=request.tracer.project).first() if delete_obj.file_type == 1: # 删除文件,需要释放cos # 将容量释放 request.tracer.project.use_space -= delete_obj.file_size request.tracer.project.save() # cos中删除文件 delete_file(bucket=request.tracer.project.bucket, key=delete_obj.key, region=request.tracer.project.region) # 数据库文件删除 delete_obj.delete() return JsonResponse({'code': 200}) else: # 删除文件夹及文件夹内的文件 total_size = 0 key_list = [] # 文件名列表 folder_list = [delete_obj] for folder in folder_list: child_list = FileRepository.objects.filter( project=request.tracer.project, child=folder).order_by('-file_type') for child in child_list: if child.file_type == 1: # 表示文件夹 folder_list.append(child) else: # 表示是文件 total_size += child.file_size key_list.append({"Key": child.key}) # 删除文件 delete_file_list(bucket=request.tracer.project.bucket, key_list=key_list, region=request.tracer.project.region) # 释放空间 request.tracer.project.use_space -= total_size request.tracer.project.save() # 删除文件夹 delete_obj.delete() return JsonResponse({'code': 200})
def file_delete(request, project_id): """删除文件""" fid = request.GET.get("fid") # 删除数据库中文件和文件夹的信息,级联删除 delete_obj = FileRepository.objects.filter( id=fid, project=request.tracer.project).first() # 同时删除桶中的信息 if delete_obj.file_type == 1: # 文件 --> 数据库删除,cos文件删除,项目已使用的空间容量返还 # 删除文件,将容量还给当前项目的已使用空间 request.tracer.project.user_space -= delete_obj.file_size request.tracer.project.save() # COS中删除文件 delete_file(request.tracer.project.bucket, TENCENT_COS_REGION, delete_obj.key) # 数据库中删除记录 delete_obj.delete() return JsonResponse({"status": True}) # 文件夹 --> 找到当前文件夹中的所有文件 --> (数据库删除,cos文件删除,项目已使用的空间容量返还) # 反向查询?!递归修改数据 total_size = 0 key_list = [] folder_list = [ delete_obj, ] for folder in folder_list: child_list = FileRepository.objects.filter( project=request.tracer.project, parent=folder).order_by('-file_type') for child in child_list: # 遍历文件和文件夹 if child.file_type == 2: folder_list.append(child) else: # 这个时候-->处理文件 total_size += child.file_type # delete_file(request.tracer.project.bucket, request.tracer.project.region, child.key) key_list.append({"Key": child.key}) # COS批量删除文件 if key_list: delete_file_list(request.tracer.project.bucket, request.tracer.project.region, key_list) # 归还文件大小 if total_size: request.tarcer.project.user_space -= delete_obj.file_size request.tracer.project.save() delete_obj.delete() return JsonResponse({"status": True})
def file_delete(request, project_id): """ 删除文件(数据库中文件删除,cos文件删除,当前项目已使用的空间容量还原 删除文件夹(找到该文件夹下所有的文件都要进行-->数据库中和cos删除,当前项目已使用的空间容量还原 :param request: :param project: :return: """ fid = request.GET.get("fid") # 删除数据库中的文件 & 文件夹 (级联删除) delete_object = models.FileRepository.objects.filter( id=fid, project=request.tracer.project).first() if delete_object.file_type == 1: # 删除文件(数据库中文件删除,cos文件删除,当前项目已使用的空间容量还原 # 删除文件时,将容量还给当前项目。先找到当前项目已使用空间,然后减去当前文件大小 request.tracer.project.user_space -= delete_object.file_size # 单位是字节 request.tracer.project.save() # cos中删除文件 delete_file(request.tracer.project.bucket, request.tracer.project.region, delete_object.key) # 在数据库中删除 delete_object.delete() return JsonResponse({'status': True}) # 删除文件夹(找到该文件夹下所有的文件都要进行-->数据库中和cos删除,当前项目已使用的空间容量还原 total_size = 0 key_list = [] # 文件所有的key folder_list = [ delete_object, ] # 目录列表 for folder in folder_list: # 文件夹下面的所有文件和文件夹 child_list = models.FileRepository.objects.filter( project=request.tracer.project, parent=folder).order_by("-file_type") for child in child_list: if child.file_type == 2: # 文件夹,添加到folder_list中 folder_list.append(child) else: # 文件大小汇总 total_size += child.file_size # 删除文件,每次都删除一个文件,效率低 # delete_file(request.tracer.project.bucket, request.tracer.project.region, child.key) # 腾讯提供的批量删除 key_list.append({"Key": child.key}) # cos批量删除文件 if key_list: delete_file_list(request.tracer.project.bucket, request.tracer.project.region, key_list) # 归还容量 if total_size: request.tracer.project.user_space -= total_size request.tracer.project.save() # 删除数据库中的文件 delete_object.delete() return JsonResponse({"status": True})
def file_delete(request, project_id): """删除文件""" fid = request.GET.get('fid') delete_object = FileRepository.objects.filter(id=int(fid), project_id=project_id).first() # cos操作需要传递的参数 bucket_name = request.tracer.project.bucket # 桶名称 region = request.tracer.project.region # 桶所在的区域 key = delete_object.key # 要删除的文件名称 if delete_object.file_type == 1: # todo 删除文件(数据库文件删除, cos文件删除,项目已经使用的空间更新) # 1、归还项目已经使用空间 request.tracer.project.use_space -= delete_object.file_size # 文件空间使用字节为单位 request.tracer.project.save() # 2、cos 文件删除 delete_file(bucket_name, region, key) # 3、数据库中删除文件 delete_object.delete() return JsonResponse({'status': True}) else: # todo 删除文件夹(找到文件夹中的所有文件数据库文件删除, cos文件删除,项目已经使用的空间更新) total_size = 0 delete_key_list = [] # 1、使用队列遍历文件夹及其所有子文件夹, 找到所有需要删除的文件 folder_list = [delete_object] for folder in folder_list: child_list = FileRepository.objects.filter(project_id=project_id, parent=folder).order_by('-file_type') for child in child_list: if child.file_type == 2: # 如果是文件夹加入到队列中 folder_list.append(child) else: # 如果是文件,计算容量,将文件存储在COS中的名称加入到删除列表,不放入队列 total_size += child.file_size delete_key_list.append({'Key': child.key}) # 2、cos中批量删除 if delete_key_list: delete_file_list(bucket_name, region, delete_key_list) # 3、归还项目已经使用空间 if total_size: request.tracer.project.use_space -= total_size # 文件空间使用字节为单位 request.tracer.project.save() # 4、数据库中删除文件 delete_object.delete() return JsonResponse({'status': True})
def file_delete(request, project_id): """删除文件""" fid = request.GET.get('fid') # 删除数据库中的文件和文件夹(内部已经包含级联删除) delete_object = models.FileRepository.objects.filter( id=fid, project=request.bug_mgt.project).first() if delete_object.file_type == 1: # 删除文件(数据库文件删除,cos文件删除,项目已使用空间回收) # 释放空间 request.bug_mgt.project.used_space -= delete_object.size request.bug_mgt.project.save() # cos中删除文件 delete_file(request.bug_mgt.project.bucket, request.bug_mgt.project.region, delete_object.key) # 在数据库中删除文件 delete_object.delete() return JsonResponse({'status': True}) else: # 删除文件夹(找到文件夹下所有文件->数据库文件删除,cos文件删除,项目已使用空间回收) # 设置总的释放空间的变量 total_size = 0 # 设置用于存放要删除的文件的唯一文件名 key_list = [] # 设置文件夹集合,用于存放要遍历的文件夹 folder_list = [ delete_object, ] for folder in folder_list: child_list = models.FileRepository.objects.filter( project=request.bug_mgt.project, parent=folder).order_by('-file_type') for child in child_list: if child.file_type == 2: folder_list.append(child) else: # 否则的话就是文件,对文件大小汇总 total_size += child.size # 删除文件 key_list.append({'Key': child.key}) # cos中删除文件 if key_list: delete_file_list(request.bug_mgt.project.bucket, request.bug_mgt.project.region, key_list) # 释放空间 if total_size: request.bug_mgt.project.used_space -= total_size request.bug_mgt.project.save() # 在数据库中删除文件 delete_object.delete() return JsonResponse({'status': True})
def file_delete(request, project_id): """删除文件/文件夹""" fid = request.GET.get('fid') # 级联删除数据库中的值,还需要删除cos中的文件 will_be_deleted = models.FileRepository.objects.filter(id=fid, project=request.lxyker.project).first() if will_be_deleted.file_type == 1: # 删除的是文件 # 归还已经使用的空间 request.lxyker.project.use_space -= will_be_deleted.file_size request.lxyker.project.save() # cos中删除文件 delete_file(request.lxyker.project.bucket, request.lxyker.project.region, will_be_deleted.key) else: # 删除的是文件夹 total_size = 0 keys = list() # 列表中是将要删除的文件的key,且按照cos规定的格式构造 folder_list = [will_be_deleted, ] for folder in folder_list: child_list = models.FileRepository.objects.filter(project=request.lxyker.project, parent=folder).order_by( '-file_type') for child in child_list: if child.file_type == 2: folder_list.append(child) else: # 统计文件大小 total_size += child.file_size # 要删除的文件,加入到keys列表中 keys.append({'Key': child.key}) # 按照cos给出的固定格式添加到keys # 批量删除cos中的文件 if keys: delete_files(request.lxyker.project.bucket, request.lxyker.project.region, keys) if total_size: # 归还已经使用的空间 request.lxyker.project.use_space -= total_size request.lxyker.project.save() # 级联删除数据库中的文件 will_be_deleted.delete() return JsonResponse({'status': True})
def file_delete(request, project_id): """删除文件 级联删除""" fid = request.GET.get('fid') delete_object = models.FileRepository.objects.filter( id=fid, project=request.tracer.project).first() if delete_object.file_type == 1: # 删除文件 request.tracer.project.use_space -= delete_object.file_size request.tracer.project.save() # cos中删除文件 delete_file(request.tracer.project.bucket, request.tracer.project.region, delete_object.key) delete_object.delete() return JsonResponse({'status': True}) else: # 删除文件夹 models.FileRepository.objects.filter(parent=delete_object) total_size = 0 folder_list = [delete_object] key_list = [] for folder in folder_list: child_list = models.FileRepository.objects.filter( project=request.tracer.project, parent=folder).order_by('-file_type') for child in child_list: if child.file_type == 2: folder_list.append(child) else: total_size += child.file_size # 删除文件 key_list.append({'Key': child.key}) if key_list: delete_file_list(request.tracer.project.bucket, request.tracer.project.region, key_list) if total_size: request.tracer.project.use_space -= total_size request.tracer.project.save() delete_object.delete() return JsonResponse({'status': True})
def file_delete(request, project_id): fid = request.GET.get('fid') # 删除数据库中的文件及文件夹 级联删除 del_obj = models.FileRepository.objects.filter( id=fid, project_id=project_id).first() if del_obj.file_type == 1: # 删除文件 并将存储空间进行更新 request.userInfo.project.use_space -= del_obj.file_size request.userInfo.project.save() # 删除cos文件 delete_file(bucket_name=request.userInfo.project.bucket, bucket_region=request.userInfo.project.region, key=del_obj.key) else: # 删除文件夹 total_size统计文件下子文件的大小 key_list 保存文件下所有子文件的cos文件名 total_size = 0 key_list = [] folder_obj_list = [ del_obj, ] for folder_obj in folder_obj_list: child_list = models.FileRepository.objects.filter( project=request.userInfo.project, parent_file=folder_obj) for child in child_list: if child.file_type == 2: # 文件夹 folder_obj_list.append(child) else: # 文件 total_size += child.file_size key_list.append({'Key': child.key}) # 删除cos中 文件夹下所有的文件 if key_list: delete_file_list(bucket_name=request.userInfo.project.bucket, bucket_region=request.userInfo.project.region, key_list=key_list) if total_size: request.userInfo.project.use_space -= total_size request.userInfo.project.save() # 删除数据库所有的文件信息 del_obj.delete() return JsonResponse({'status': True})
def file_delete(request, project_id): """删除文件""" fid = request.GET.get('fid') #级连删除(仅删除了数据库文件) delete_object = models.FileRepository.objects.filter( id=fid, project=request.blog.project).first() print(delete_object) if delete_object.file_type == 1: #删除文件(数据库文件删除,cos文件删除,返回使用空间) #删除文件,将容量返回给当前项目已使用空间 request.blog.project.user_space -= delete_object.file_size request.blog.project.save() #cos删除文件 delete_file(request.blog.project.bucket, request.blog.project.region, delete_object.key) #zai数据库删除当前文件 delete_object.delete() return JsonResponse({'status': True}) total_size = 0 key_list = [] folder_list = [ delete_object, ] for folder in folder_list: child_list = models.FileRepository.objects.filter( project=request.blog.project, parent=folder).order_by('-file_type') for child in child_list: if child.file_type == 2: folder_list.append(child) else: total_size += child.file_size key_list.append({"Key": child.key}) if key_list: delete_file_list(request.blog.project.bucket, request.blog.project.region, key_list) if total_size: request.blog.project.user_space -= total_size request.blog.project.save() delete_object.delete() return JsonResponse({'status': True})
def delete_view(request): """ 删除文件(夹) """ delete_id = request.GET.get('did') delete_object = FileRepository.objects.filter( id=delete_id, update_user=request.user).first() if delete_object.file_type == 1: # 删除文件 # cos中删除文件 delete_file(bucket=request.user.bucket, region=request.user.region, key=delete_object.key) # 数据库中删除文件 delete_object.delete() else: # 删除文件夹 # 设置一个队列q,bfs删除文件(夹) q = [delete_object] hh, tt = 0, 0 key_list = [] # 待删除的文件列表,每个元素的格式为 {'Key': key} while hh <= tt: # 当q不空 # 取出队头文件夹 t = q[hh] hh += 1 # 遍历t下的所有文件(夹) file_list = FileRepository.objects.filter(update_user=request.user, parent=t) for file in file_list: if file.file_type == 1: # file是文件 key_list.append({'Key': file.key}) else: # file是文件夹 q.append(file) tt += 1 if key_list: # cos批量删除文件 delete_file_list(bucket=request.user.bucket, region=request.user.region, key_list=key_list) # 在数据库中删除文件夹 delete_object.delete() return JsonResponse({'status': True})