def api_upload(service, encData, encMeta, keys): ''' Uploads data to Send. Caution! Data is uploaded as given, this function will not encrypt it for you ''' service += 'api/upload' files = requests_toolbelt.MultipartEncoder( fields={'file': ('blob', encData, 'application/octet-stream')}) pbar = progbar(files.len) monitor = requests_toolbelt.MultipartEncoderMonitor( files, lambda files: pbar.update(monitor.bytes_read - pbar.n)) headers = { 'X-File-Metadata': unpadded_urlsafe_b64encode(encMeta), 'Authorization': 'send-v1 ' + unpadded_urlsafe_b64encode(keys.authKey), 'Content-type': monitor.content_type } r = requests.post(service, data=monitor, headers=headers, stream=True) r.raise_for_status() pbar.close() body_json = r.json() secretUrl = body_json['url'] + '#' + unpadded_urlsafe_b64encode( keys.secretKey) fileId = body_json['id'] fileNonce = unpadded_urlsafe_b64decode( r.headers['WWW-Authenticate'].replace('send-v1 ', '')) delete_token = body_json['delete'] return secretUrl, fileId, fileNonce, delete_token
def post(self, url, content='', files=None, params=None, extra_headers={}, upload_callback=None): 'HTTP Post files[] or content (unicode string) to url' if not url.startswith('http'): # relative url url = self.rootpath + url log.debug('posting content (len %s) to url %s', len(content) if content is not None else '?', url) headers = self.session.headers.copy() headers.update(**extra_headers) if not files is None: m = requests_toolbelt.MultipartEncoder(fields=files) if upload_callback is not None: m_len = m.len # compute value for callback closure def callback(monitor): upload_callback(monitor, m_len) m = requests_toolbelt.MultipartEncoderMonitor(m, callback) headers['content-type'] = m.content_type else: m = content url = self.escapeUrl(url) r = self.session.post(url, data=m, params=params, headers=headers) if not r.ok: log.warning('HTTP POST failed: %s', r.text) raise JFSError(r.reason) return self.getObject(r) # return a JFS* class
def upload(self, filename=None, url=None, progress=True): """Upload a local or remote file.""" if filename and url: raise ValueError('Ambiguous call, both filename and url provided') if not filename or url: raise ValueError( 'Missing keyword argument, either filename or url required') file_multipart = { 'file': (os.path.basename(filename), open(filename, 'rb'), 'application/octet-stream') } encoder = requests_toolbelt.MultipartEncoder(fields=file_multipart) print('Uploading ' + os.path.basename(filename)) if not progress: monitor = requests_toolbelt.MultipartEncoderMonitor( encoder, upload_callback_nobar) else: monitor = requests_toolbelt.MultipartEncoderMonitor( encoder, upload_callback) headers = { 'Authorization': 'Bearer ' + self.api.token, 'Origin': 'cloudrun.co', 'Content-Type': monitor.content_type } _url = API_URL + '/runs/' + self.id + '/input' r = requests.post(_url, headers=headers, data=monitor) if progress: sys.stdout.write('\n') sys.stdout.flush() if r.status_code == 200: self.get() else: raise ValueError('Server responded with ' + str(r.status_code))
def _upload(self, package: package_file.PackageFile) -> requests.Response: data = package.metadata_dictionary() data.update( { # action ":action": "file_upload", "protocol_version": "1", } ) data_to_send = self._convert_data_to_list_of_tuples(data) print(f"Uploading {package.basefilename}") with open(package.filename, "rb") as fp: data_to_send.append( ("content", (package.basefilename, fp, "application/octet-stream")) ) encoder = requests_toolbelt.MultipartEncoder(data_to_send) with ProgressBar( total=encoder.len, unit="B", unit_scale=True, unit_divisor=1024, miniters=1, file=sys.stdout, disable=self.disable_progress_bar, ) as bar: monitor = requests_toolbelt.MultipartEncoderMonitor( encoder, lambda monitor: bar.update_to(monitor.bytes_read) ) resp = self.session.post( self.url, data=monitor, allow_redirects=False, headers={"Content-Type": monitor.content_type}, ) return resp
def post(self, url, content='', files=None, params=None, extra_headers={}, upload_callback=None): 'HTTP Post files[] or content (unicode string) to url' if not url.startswith('http'): # relative url url = self.rootpath + url # TODO: Re-enable cache after making it work with MultipartEncoder #logging.debug('yanking url from cache: %s', url) #cache = requests_cache.core.get_cache() #cache.delete_url(url) logging.debug('posting content (len %s) to url %s', content is not None and len(content) or '?', url) headers = self.session.headers.copy() headers.update(**extra_headers) if not files is None: m = requests_toolbelt.MultipartEncoder(fields=files) if upload_callback is not None: m_len = len(m) def callback(monitor): upload_callback(monitor, m_len) m = requests_toolbelt.MultipartEncoderMonitor(m, callback) headers['content-type'] = m.content_type else: m = content r = self.session.post(url, data=m, params=params, headers=headers) if r.status_code in (500, 404, 401, 403, 400): logging.warning('HTTP POST failed: %s', r.text) raise JFSError(r.reason) return self.getObject(r) # return a JFS* class
def ul(self, fpath: str, tpath: str = '') -> str: if not os.path.isabs(fpath): fpath = os.path.join(os.getcwd(), fpath) if not tpath: tpath = os.path.basename(fpath) if not os.path.isfile(fpath): return '' tpath = os.path.join(self.path, tpath) fname = list(os.path.splitext(tpath)) if self.__isfile(''.join(fname)): i = 1 while self.__isfile(fname[0]+'_'+str(i)+fname[1]): i += 1 fname[0] = fname[0]+'_'+str(i) pb = misc.ProgressBar(os.path.getsize(fpath), title='Uploading "{}"'.format(os.path.basename(fpath))) e = reqt.MultipartEncoder(fields=dict(file=(os.path.basename(''.join(fname)), open(fpath, 'rb'),))) def up(mon: reqt.MultipartEncoderMonitor) -> None: pb.update(mon.bytes_read) m = reqt.MultipartEncoderMonitor(e, up) res = self.sess.post(self.url()+'u/'+self.__benc(''.join(fname)), data=m, headers={'Content-Type': m.content_type,}) if res.status_code != 200: return '' return ''.join(fname)
""" 显示上传进度条 num:已上传大小 Sum:文件总大小 #l:定义进度条大小 """ bar_length = 50 # 定义进度条大小 percent = float(num) / float(Sum) hashes = '=' * int(percent * bar_length) # 定义进度显示的数量长度百分比 spaces = ' ' * (bar_length - len(hashes)) # 定义空格的数量=总长度-显示长度 sys.stdout.write("\rsend: [%s] %d%% %s/%s " % (hashes + spaces, percent * 100, humanbytes(num), humanbytes(Sum))) # 输出显示进度条 sys.stdout.flush() # 强制刷新到屏幕 def my_callback(monitor): # Your callback function print monitor.bytes_read progres(monitor.bytes_read, total) m = requests_toolbelt.MultipartEncoderMonitor(m, my_callback) req_headers = { 'Content-Type': m.content_type, 'path': '2016/07/09/5ASD5SDFASDFASDF/{}.zip'.format(time.time()), } r = requests.post(config["upload_url"], data=m, headers=req_headers)