def upload(request): try: upload_file = request.FILES.get('fileBlob') file_name = request.POST.get('fileName') # 使用md5后的文件名保存分段,防止合并时因为文件名的原因出错 file_name_md5 = hashlib.md5(file_name.encode(encoding='UTF-8')).hexdigest() file_chunk_count = request.POST.get('chunkCount') file_chunk_index = request.POST.get('chunkIndex') file_size = request.POST.get('fileSize') if int(file_size) > 5 * 1024 * 1024 * 1024: error_message = '文件过大!' return JsonResponse({"code": 400, "error": error_message}) local_file_path = settings.TMP_ROOT local_file = '{}/{}'.format(local_file_path, '{}_{}_{}'.format( file_name_md5, file_chunk_count, int(file_chunk_index) + 1) ) with open(local_file, 'wb') as f: for chunk in upload_file.chunks(): f.write(chunk) complete = file_combine(int(file_size), int(file_chunk_count), local_file_path, file_name, file_name_md5) mess = { "code": 200, "chunkIndex": file_chunk_index, "filename": '{}/{}'.format(local_file_path, file_name), "complete": complete, } return JsonResponse(mess) # fileinput 分片上传 except Exception: logger.error(traceback.format_exc()) error_message = '上传文件错误!' return JsonResponse({"code": 401, "error": error_message})
def session_upload(request): username = request.session.get('username') group = request.POST.get('group') if not group: error_message = '错误的请求参数!' return JsonResponse({"code": 400, "error": error_message}) session = TerminalSession.objects.filter( user=username, group=group, ) if not session: error_message = '不存在的会话!' return JsonResponse({"code": 400, "error": error_message}) try: # upload_file = request.FILES.get('upload_file') upload_file = request.FILES.get('fileBlob') file_name = request.POST.get('fileName') # 使用md5后的文件名保存分段,防止合并时因为文件名的原因出错 file_name_md5 = hashlib.md5( file_name.encode(encoding='UTF-8')).hexdigest() file_chunk_count = request.POST.get('chunkCount') file_chunk_index = request.POST.get('chunkIndex') file_size = request.POST.get('fileSize') upload_file_path = os.path.join(settings.GUACD_ROOT, group) if not os.path.exists(upload_file_path): os.makedirs(upload_file_path, exist_ok=True) local_file = '{}/{}'.format( upload_file_path, '{}_{}_{}'.format(file_name_md5, file_chunk_count, int(file_chunk_index) + 1)) with open(local_file, 'wb') as f: for chunk in upload_file.chunks(): f.write(chunk) complete = file_combine(int(file_size), int(file_chunk_count), upload_file_path, file_name, file_name_md5) mess = { "code": 200, "chunkIndex": file_chunk_index, "filename": file_name, "complete": complete, } if complete: channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)(group, { "type": "upload.message", "text": file_name, }) return JsonResponse(mess) # fileinput 分片上传 except Exception: error_message = '上传文件错误!' return JsonResponse({"code": 401, "error": error_message})
def session_upload(request, pk): username = request.session.get('username') if request.session['issuperuser'] and request.session['username'] == 'admin': hosts = RemoteUserBindHost.objects.filter(pk=pk, enabled=True) else: hosts = RemoteUserBindHost.objects.filter( Q(user__username=username) | Q(group__user__username=username), pk=pk, enabled=True ).distinct() if not hosts: error_message = '不存在的主机!' return JsonResponse({"code": 400, "error": error_message}) try: remote_host = hosts[0] # upload_file = request.FILES.get('upload_file') upload_file = request.FILES.get('fileBlob') file_name = request.POST.get('fileName') # 使用md5后的文件名保存分段,防止合并时因为文件名的原因出错 file_name_md5 = hashlib.md5(file_name.encode(encoding='UTF-8')).hexdigest() file_chunk_count = request.POST.get('chunkCount') file_chunk_index = request.POST.get('chunkIndex') file_size = request.POST.get('fileSize') upload_file_path = os.path.join(settings.MEDIA_ROOT, username, 'upload', remote_host.ip) if not os.path.exists(upload_file_path): os.makedirs(upload_file_path, exist_ok=True) local_file = '{}/{}'.format(upload_file_path, '{}_{}_{}'.format( file_name_md5, file_chunk_count, int(file_chunk_index) + 1) ) with open(local_file, 'wb') as f: for chunk in upload_file.chunks(): f.write(chunk) complete = file_combine(int(file_size), int(file_chunk_count), upload_file_path, file_name, file_name_md5) uploaded = False remote_path = None if complete: start_time = timezone.now() sftp = SFTP( remote_host.ip, remote_host.port, remote_host.remote_user.username, decrypt(remote_host.remote_user.password) ) uploaded, remote_path = sftp.upload_file(file_name, upload_file_path) os.remove('{}/{}'.format(upload_file_path, file_name)) terminal_log( username, remote_host.hostname, remote_host.ip, 'sftp', remote_host.port, remote_host.remote_user.username, '上传文件 {}/{}'.format(remote_path, file_name), 'nothing', request.META.get('REMOTE_ADDR', None), # 客户端 ip request.META.get('HTTP_USER_AGENT', None), start_time, ) mess = { "code": 200, "chunkIndex": file_chunk_index, "filename": file_name, "complete": complete, "uploaded": uploaded, "remote_path": remote_path } return JsonResponse(mess) # fileinput 分片上传 except Exception: error_message = '上传文件错误!' return JsonResponse({"code": 401, "error": error_message})