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
示例#2
0
 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))
示例#3
0
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))
示例#4
0
    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()
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
 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
示例#8
0
    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)
示例#9
0
 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()
示例#10
0
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
示例#12
0
    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']
示例#13
0
    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']