Python - 如何上传大文件

时间:2014-01-18 18:06:07

标签: python

我编写脚本,将大文件上传到第三方网站。我使用poster模块

这里是代码

class upload_in_chunks(object):
    def __init__(self, filename, chunksize):
        self.filename = filename
        self.chunksize = chunksize
        self.totalsize = os.path.getsize(filename)
        self.readsofar = 0

    def __iter__(self):
        with open(self.filename, 'rb') as file:
            while True:
                data = file.read(self.chunksize)
                if not data:
                    sys.stderr.write("\n")
                    break
                self.readsofar += len(data)
                percent = self.readsofar * 1e2 / self.totalsize
                sys.stderr.write("\r{percent:3.0f}%".format(percent=percent))
                yield data

    def __len__(self):
        return self.totalsize


class IterableToFileAdapter(object):
    def __init__(self, iterable):
        self.iterator = iter(iterable)
        self.length = len(iterable)

    def read(self, size=-1): # TBD: add buffer for `len(data) > size` case
        return next(self.iterator, b'')

    def __len__(self):
        return self.length


def upload_file(s, data, files, url):
        class FuncThread(threading.Thread):
            def __init__(self, s, data, files, url):
                threading.Thread.__init__(self)
                self.result = False
                self.error = None
                self.s = s
                self.data = data
                self.files = files
                self.url = url

            def run(self):
                try:
                    register_openers()
                    items = []
                    for name, value in self.data.items():
                        items.append(MultipartParam(name, value))
                    #add file
                    for name, value in self.files.items():
                        items.append(MultipartParam.from_file(name, value))
                    datagen, h = multipart_encode(items)
                    #h.update(headers)
                    # Create the Request object
                    #self.result = self.s.post(self.url, data = datagen.read(), headers = h)
                    for item, value in headers.iteritems():
                        h[item] = value
                    #for item, value in headers.iteritems():
                        #h[item] = value
                    h["Cookie"] = ""
                    for item, value in requests.utils.dict_from_cookiejar(self.s.cookies).iteritems():
                        h["Cookie"] += item + "=" + value + "; "
                    print h["Cookie"]

                    #h[item] = value
                    print h
                    request = urllib2.Request(self.url, datagen, h)
                     #Actually do the request, and get the response
                    self.result = urllib2.urlopen(request).read()
                except Exception as error:
                    self.error = error
                    self.result = False

            def _stop(self):
                if self.isAlive():
                    threading.Thread._Thread__stop(self)
        try:
            it = FuncThread(s, data, files, url)
            it.start()
            it.join(upload_timeout)
            if it.isAlive():
                it._stop()
                return (False, "[-] Time expired.")
            else:
                return (it.result, it.error)
        except Exception as error:
            return (False, error)

在我的upload.py中,我使用

try:

            payload = {'Filename': f_path,
                       'tags': 'tag1',                           
                       'keywords': 'keyword1',
                       'cookie': cookie,
                       'title':  'Large file',
                       'categories': '["35","13","37"]',
                       'privacy': 'community',
                       'source': 5,
                       'production': "professional"}

            (r, error) = upload_file(self.s, payload, {'Filedata': f_path}, url)

我有100米\位互联网频道的专用服务器。

但我的脚本仅使用1-2 m \ bit

上传文件

网站收件人没有任何限制,也没有限制我。

如何强制我的代码使用完整的100 m \ bit?

0 个答案:

没有答案