示例#1
0
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})
示例#2
0
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})
示例#3
0
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})