Exemplo n.º 1
0
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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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))
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
 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)
Exemplo n.º 7
0
    """
    显示上传进度条
    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)