def test_from_fields(self): monitor = MultipartEncoderMonitor.from_fields( self.fields, self.boundary ) assert isinstance(monitor, MultipartEncoderMonitor) assert isinstance(monitor.encoder, MultipartEncoder) assert monitor.encoder.boundary_value == self.boundary
def run(self): """ Run the worker thread """ upl_imgs = list() my_list_chunks = [ self.uploadFiles[i * self.limit:(i + 1) * self.limit] for i in range((len(self.uploadFiles) + self.limit - 1) // self.limit) ] for img_slice in my_list_chunks: m = MultipartEncoderMonitor.from_fields(fields={ f'file_{i}': ('filename', open(fPath, 'rb'), guess_type(str(fPath))[1]) for i, fPath in enumerate(img_slice) }, callback=self.my_callback) images = requests.post('https://dtf.ru/andropov/upload', data=m, headers={ 'Content-Type': m.content_type, "x-this-is-csrf": "THIS IS SPARTA!" }).json() print(images) upl_imgs.extend(images['result']) # wx.CallAfter(pub.sendMessage, f"update_upload", count=self.uploadSize) wx.CallAfter(pub.sendMessage, f"update_upload", count=self.uploadSize) wx.CallAfter(pub.sendMessage, f"upload_complete", img_list=zip( map(lambda x: x.name.split('.')[0], self.uploadFiles), upl_imgs))
def send_file(name, size): try: encoder = MultipartEncoderMonitor.from_fields(fields={ 'file': (name, open(os.path.join(args.directory_path, name), 'rb')) }) progress.last_len = 0 pbar = tqdm(total=encoder.len, leave=True, unit_scale=True, unit='B', miniters=1, desc='sending {}'.format(name)) monitor = MultipartEncoderMonitor( encoder, lambda monitor: progress(monitor.bytes_read, pbar)) r = requests.post(upload_url, data=monitor, headers={'Content-Type': monitor.content_type}) progress(size, pbar) if 'Success' not in r.text: print(r.text) else: print('done.\a') # \a = audio signal except UnicodeDecodeError: exit( 'Oops, unicode filenames are not yet supported, please delete the file "{}" and try again. :(' .format(name))
def upload_files(self, path, filename): try: f = open(filename, 'rb') except FileNotFoundError: raise BaseException('File not found') destination = path + os.path.basename(filename) monitor = MultipartEncoderMonitor.from_fields( fields={'file': ('filename', f, 'application/octet-stream')}, ) upload_response = self.session.post( self.uploadTarget, data=monitor, headers={'Content-Type': monitor.content_type}, verify=False) if upload_response.status_code is not 200: raise BaseException('Error') hash = upload_response.content.decode("utf-8").split(';')[0] filesize = upload_response.content.decode("utf-8").split(';')[1][:-2] response = self.session.post("https://cloud.mail.ru/api/v2/file/add", data={ "token": self.token, "home": destination, "conflict": 'rename', "hash": hash, "size": filesize, }) return response.json()
def upload_files(self, file, file_name, folder_name): progress = tqdm(unit='B') progress.desc = file_name destination = '/' + folder_name + '/' + file_name # if os.path.getsize(file['filename']) > 1024 * 1024 * 1024 * 2: # raise PyMailCloudError.FileSizeError monitor = MultipartEncoderMonitor.from_fields( fields={'file': ('filename', file, 'application/octet-stream')}, callback=lambda monitor: self.upload_callback(monitor, progress)) upload_response = self.session.post(self.uploadTarget, data=monitor, headers={'Content-Type': monitor.content_type},verify=False) if upload_response.status_code is not 200: raise PyMailCloudError.NetworkError print(monitor) hash, filesize = upload_response.content.decode("utf-8").split(';')[0], upload_response.content.decode("utf-8").split(';')[1][:-2] response = self.session.post("https://cloud.mail.ru/api/v2/file/add", # "http://httpbin.org/post", data={ "token": self.token, "home": destination, "conflict": 'rename', "hash": hash, "size": filesize, }) return json.dumps(response.json(), sort_keys=True, indent=3, ensure_ascii=False)
def upload_files(self, fileslist): path = '' progress = tqdm(unit='B') for file in fileslist: progress.desc = file['filename'] try: f = open(file['filename'], 'rb') except FileNotFoundError: print("File not found: {}".format(file['filename'])) break files = {'file': f} if 'path' not in file: path = '/' else: path = file['path'] destination = path + os.path.basename(file['filename']) if os.path.getsize(file['filename']) > 1024 * 1024 * 1024 * 2: raise PyMailCloudError.FileSizeError monitor = MultipartEncoderMonitor.from_fields( fields={'file': ('filename', f, 'application/octet-stream')}, callback=lambda monitor: self.upload_callback(monitor, progress)) upload_response = self.session.post(self.uploadTarget, data=monitor, headers={'Content-Type': monitor.content_type}) if upload_response.status_code is not 200: raise PyMailCloudError.NetworkError hash, filesize = upload_response.content.decode("utf-8").split(';')[0], upload_response.content.decode("utf-8").split(';')[1][:-2] response = self.session.post("https://cloud.mail.ru/api/v2/file/add", # "http://httpbin.org/post", data={ "token": self.token, "home": destination, "conflict": 'rename', "hash": hash, "size": filesize, }) return json.dumps(response.json(), sort_keys=True, indent=3, ensure_ascii=False)
def run(self): while True: try: user, password, host, filedata = self.queue.get() self.name = host self.lengthofdata = len(filedata) payload = {'name': user, 'pwd': password} print('{}: Logging in'.format(self.name)) self.response = self.session.post( "http://{}/cgi/login.cgi".format(host), headers=self.headers, data=payload, timeout=10) if self.response.status_code == 200 and "../cgi/url_redirect.cgi?url_name=mainmenu" in self.response.text: print('{}: Logged in successfully'.format(self.name)) opt = MultipartEncoderMonitor.from_fields( fields=[('FileType', '3'), ('preserve_config', '1'), ('FS_Whatever', ('SMT_X10_185.bin', filedata, 'application/octet-stream'))], callback=self.progressbar ) # If you change your file location don't forget to change file name as well print('{}: Uploading file'.format(self.name)) self.response = self.session.post("http://{}/cgi/firmware_upload.cgi".format( host), headers=self.headers, data=opt, timeout=360) if self.response.status_code == 200 and "complete" in self.response.text: print('{}: Upload successful, give us 1 minute to install and reboot'.format( self.name)) except: print("error") traceback.print_exc() self.queue.task_done() return
def upload_files(self, fileslist): path = '' progress = tqdm(unit='B') for file in fileslist: progress.desc = file['filename'] try: f = open(file['filename'], 'rb') except FileNotFoundError: print("File not found: {}".format(file['filename'])) break files = {'file': f} if 'path' not in file: path = '/' else: path = file['path'] destination = path + os.path.basename(file['filename']) if os.path.getsize(file['filename']) > 1024 * 1024 * 1024 * 2: raise PyMailCloudError.FileSizeError monitor = MultipartEncoderMonitor.from_fields( fields={'file': ('filename', f, 'application/octet-stream')}, callback=lambda monitor: self.upload_callback( monitor, progress)) upload_response = self.session.post( self.uploadTarget, data=monitor, headers={'Content-Type': monitor.content_type}, verify=False) if upload_response.status_code is not 200: raise PyMailCloudError.NetworkError hash, filesize = upload_response.content.decode("utf-8").split( ';')[0], upload_response.content.decode("utf-8").split( ';')[1][:-2] response = self.session.post( "https://cloud.mail.ru/api/v2/file/add", # "http://httpbin.org/post", data={ "token": self.token, "home": destination, "conflict": 'rename', "hash": hash, "size": filesize, }) return json.dumps(response.json(), sort_keys=True, indent=3, ensure_ascii=False)
def upload_file(self, username, filepath, cb_percentage, cb_success, cb_failure): self.file_size = os.path.getsize(filepath) self.bytes_read = 0 self.diff_sum = 0 filename = filepath.split('/')[-1] mime_type = mimetypes.guess_type(filepath) m = MultipartEncoderMonitor.from_fields( fields={ 'username': username, 'filename': filename, 'file': (filename, open(filepath, 'rb'), mime_type[0]) }, callback=lambda monitor: self.cb_file_upload( monitor, cb_percentage)) resp = post(self.server_addr + 'upload/', data=m, headers={'Content-Type': m.content_type}) if resp.status_code == 200: cb_success() else: cb_failure()
def send_file(name, size): try: encoder = MultipartEncoderMonitor.from_fields( fields={"file": (name, open(os.path.join(args.directory_path, name), "rb"))} ) progress.last_len = 0 pbar = tqdm( total=encoder.len, leave=True, unit_scale=True, unit="B", miniters=1, desc="sending {}".format(name) ) monitor = MultipartEncoderMonitor(encoder, lambda monitor: progress(monitor.bytes_read, pbar)) r = requests.post(upload_url, data=monitor, headers={"Content-Type": monitor.content_type}) progress(size, pbar) if "Success" not in r.text: print(r.text) else: print("done.\a") except UnicodeDecodeError: print('Oops, there was a problem with the file "{}!\n Unicode filenames are not supported.'.format(name)) return except requests.exceptions.ConnectionError: exit("Oops, no response from your Flashair card at {}".format(upload_url))
def test_from_fields(self): monitor = MultipartEncoderMonitor.from_fields(self.fields, self.boundary) assert isinstance(monitor, MultipartEncoderMonitor) assert isinstance(monitor.encoder, MultipartEncoder) assert monitor.encoder.boundary_value == self.boundary
def resume(self): if self.finished: raise UploadException('Tried to resume finished upload') self.paused = False headers = {'User-Agent': 'Mozilla/5.0'} resp = self.chomik.sess.get( 'http{}://{server}/resume/check/?key={key}'.format( 's' if self.chomik.ssl else '', server=self.server, key=self.key), headers=headers) resp = xmltodict.parse(resp.content)['resp'] resume_from = int(resp['@file_size']) part = PartFile(self.file, resume_from) self.__start_pos = resume_from self.__part_size = part.len data = OrderedDict([['chomik_id', ustr(self.chomik.chomik_id)], ['folder_id', ustr(self.folder.folder_id)], ['key', self.key], ['time', self.stamp], ['resume_from', ustr(resume_from)], ['client', 'ChomikBox-' + CHOMIKBOX_VERSION], ['locale', 'PL'], ['file', (self.name, part)]]) monitor = MultipartEncoderMonitor.from_fields(fields=data, callback=self.__callback) headers = { 'Content-Type': monitor.content_type, 'User-Agent': 'Mozilla/5.0' } self.chomik.logger.debug( 'Resumed uploading file "{n}" to folder {f} from {b} bytes'.format( n=self.name, f=self.folder.folder_id, b=resume_from)) try: resp = self.chomik.sess.post('http{}://{server}/file/'.format( 's' if self.chomik.ssl else '', server=self.server), data=monitor, headers=headers) except self.UploadPaused: self.chomik.logger.debug( 'Upload of file "{n}" paused'.format(n=self.name)) return 'paused' else: self.chomik.logger.debug( 'Upload of file "{n}" finished'.format(n=self.name)) resp = xmltodict.parse(resp.content)['resp'] if resp['@res'] != '1': if '@errorMessage' in resp: raise UploadException(resp['@res'], resp['@errorMessage']) else: raise UploadException(resp['@res']) if '@fileid' not in resp: raise UploadException self.finished = True return resp['@fileid']
def start(self, attempts=0): # attempts = -1 for infinite assert isinstance(attempts, int) if self.finished: raise UploadException('Tried to start finished upload') if self.started: raise UploadException('Tried to start already started upload') self.started = True data = OrderedDict([['chomik_id', ustr(self.chomik.chomik_id)], ['folder_id', ustr(self.folder.folder_id)], ['key', self.key], ['time', self.stamp], ['client', 'ChomikBox-' + CHOMIKBOX_VERSION], ['locale', 'PL'], ['file', (self.name, self.file)]]) monitor = MultipartEncoderMonitor.from_fields(fields=data, callback=self.__callback) headers = { 'Content-Type': monitor.content_type, 'User-Agent': 'Mozilla/5.0' } try: self.chomik.logger.debug( 'Started uploading file "{n}" to folder {f}'.format( n=self.name, f=self.folder.folder_id)) resp = self.chomik.sess.post('http{}://{server}/file/'.format( 's' if self.chomik.ssl else '', server=self.server), data=monitor, headers=headers) except Exception as e: if isinstance(e, self.UploadPaused): self.chomik.logger.debug( 'Upload of file "{n}" paused'.format(n=self.name)) return 'paused' else: self.chomik.logger.debug( 'Error {e} occurred during upload of file "{n}"'.format( e=e, n=self.name)) attempt = 1 while attempts == -1 or attempts >= attempt: try: self.chomik.logger.debug( 'Resuming failed upload of file "{n}"'.format( n=self.name)) return self.resume() except Exception as ex: e = ex self.chomik.logger.debug( 'Error {e} occurred during upload of file "{n}"'. format(e=ex, n=self.name)) attempt += 1 else: raise e else: self.chomik.logger.debug( 'Upload of file "{n}" finished'.format(n=self.name)) resp = xmltodict.parse(resp.content)['resp'] if resp['@res'] != '1': if '@errorMessage' in resp: raise UploadException(resp['@res'], resp['@errorMessage']) else: raise UploadException(resp['@res']) if '@fileid' not in resp: raise UploadException self.finished = True return resp['@fileid']