示例#1
0
def getUrlWithBucketAndKey(bucket, key):
    if bucket not in qiniu_url.keys():
        return None
    q = qiniu.Auth(ACCESS_KEY, SECRET_KEY)
    return_url = "https://%s/%s" % (qiniu_url[bucket], key)
    if bucket == 'file':
        return_url = q.private_download_url(return_url)
    return return_url
示例#2
0
def bigfileupload(request):
    """
    分片上传
    """
    try:
        bucket_name = request.GET.get('bucket')
        if bucket_name not in qiniu_url.keys():
            raise InvestError(2020, msg='bucket error')
        data_dict = request.FILES
        uploaddata = None
        for key in data_dict.keys():
            uploaddata = data_dict[key]
        q = qiniu.Auth(ACCESS_KEY, SECRET_KEY)
        filetype = str(uploaddata.name).split('.')[-1]
        key = datetime.datetime.now().strftime('%Y%m%d%H%M%s') + ''.join(
            random.sample(string.ascii_lowercase, 6)) + '.' + filetype
        if filetype != 'pdf' and bucket_name not in ['image', u'image']:
            saveas_key = qiniu.urlsafe_base64_encode(
                'file:%s' % (key.split('.')[0] + '.pdf'))
            persistentOps = fops + '|saveas/' + saveas_key
            policy = {
                'persistentOps': persistentOps,
                # 'persistentPipeline': pipeline,
                'deleteAfterDays': 1,
            }
        else:
            policy = None
        print key
        params = {'x:a': 'a'}
        mime_type = uploaddata.content_type
        token = q.upload_token(bucket_name, key, 3600, policy=policy)
        progress_handler = lambda progress, total: progress / total
        uploader = _Resume(token,
                           key,
                           uploaddata,
                           uploaddata.size,
                           params,
                           mime_type,
                           progress_handler,
                           upload_progress_recorder=MyUploadProgressRecorder(),
                           modify_time=None,
                           file_name=key)
        ret, info = uploader.upload()
        if info is not None:
            if info.status_code == 200:
                return_url = getUrlWithBucketAndKey(bucket_name, ret['key'])
            else:
                raise InvestError(2020, msg=str(info))
        else:
            raise InvestError(2020, msg=str(ret))
        if policy:
            key = key.split('.')[0] + '.pdf'
        return JSONResponse(SuccessResponse({'key': key, 'url': return_url}))
    except InvestError as err:
        return JSONResponse(InvestErrorResponse(err))
    except Exception:
        return JSONResponse(
            ExceptionResponse(traceback.format_exc().split('\n')[-2]))
示例#3
0
def qiniu_deletefile(request):
    """
    param:{'bucket':str,'key':str}
    """
    try:
        data = request.data
        bucket = data.get('bucket',None)
        key = data.get('key',None)
        if bucket not in qiniu_url.keys():
            return None
        ret, info = deleteqiniufile(bucket,key)
        if info.req_id is None or info.status_code != 200:
            raise InvestError(7010,msg=json.dumps(info.text_body))
        return JSONResponse(SuccessResponse('删除成功'))
    except InvestError as err:
        return JSONResponse(InvestErrorResponse(err))
    except Exception:
        return JSONResponse(ExceptionResponse(traceback.format_exc().split('\n')[-2]))
示例#4
0
def fileChunkUpload(request):
    """
    文件分片上传
    """
    try:
        data = request.data
        file = {
            'name': unquote(data['filename']),
            'currentSize': data['currentSize'],
            'totalSize': data['totalSize'],
            'currentChunk': data['currentChunk'],
            'totalChunk': data['totalChunk'],
            'md5': data['md5'],
            'bucket': data['bucket'],
            'file': request.FILES['file']
        }
        if data.get('temp_key'):
            temp_key = data['temp_key']
        else:
            if file['currentChunk'] != '1':
                raise InvestError(8300, msg='文件上传失败', detail='非首个文件块,temp_key不能为空')
            temp_key = datetime.datetime.now().strftime('%Y%m%d%H%M%S') + ''.join(random.sample(string.ascii_lowercase, 6))
        bucket_name = data.get('bucket')
        if bucket_name not in qiniu_url.keys():
            raise InvestError(8300, msg='文件上传失败', detail='无效的bucket')
        filetype = file['name'].split('.')[-1]
        file_path = os.path.join(APILOG_PATH['uploadFilePath'], '%s.%s' % (temp_key, filetype))
        print(file_path)
        file_path_temp = file_path + '.temp'
        if file['currentChunk'] == '1' and caches['default'].get(file_path):  # 同名文件上传冲突,不进行其它操作
            raise InvestError(8300, msg='文件上传失败', detail='同名文件正在上传')
        else:  # 标记文件正在上传
            caches['default'].set(file_path, 'uploading', 2)

        checkresponse = check_file(file, file_path, file_path_temp)
        # 文件上传失败或者上传完毕后,清理暂存文件和缓存
        if checkresponse['code'] != '0' or checkresponse['is_end']:
            remove_file(file_path_temp)
            caches['default'].delete_pattern(file_path + '*')
        if checkresponse['code'] == '0':
            if checkresponse['is_end']:
                if os.path.exists(file_path):
                    inputFileKey = temp_key + '.' + filetype
                    outputFileKey = temp_key + '.' + 'pdf'
                    if filetype in ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'] and data.get('topdf', True) in ['true', True, '1', 1, u'true']:
                        changeToPdf = True
                        key = outputFileKey
                        convertKey = outputFileKey
                    else:
                        changeToPdf = False
                        key = inputFileKey
                        convertKey = None
                    QiNiuFileUploadRecord(filename=data['filename'], filesize=data['totalSize'], fileMD5=data['md5'],
                                          key=inputFileKey, bucket=data['bucket'], cretateUserId=request.user.id,
                                          convertToPDF=changeToPdf, convertKey=convertKey).save()
                    uploadFileToQiniu()
                    return JSONResponse(SuccessResponse({'key': key, 'url': getUrlWithBucketAndKey(bucket_name, key), 'realfilekey': inputFileKey, 'bucket':bucket_name}))
                else:
                    raise InvestError(8300, msg='文件上传失败', detail='上传文件丢失')
            else:
                return JSONResponse(SuccessResponse({'temp_key': temp_key, 'nextChunk': min(int(file['currentChunk']) + 1, int(file['totalChunk']))}))
        else:
            raise InvestError(8300, msg='文件上传失败', detail=checkresponse['msg'])
    except InvestError as err:
        return JSONResponse(InvestErrorResponse(err))
    except Exception:
        catchexcption(request)
        return JSONResponse(ExceptionResponse(traceback.format_exc().split('\n')[-2]))