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
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]))
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]))
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]))