2

zip ファイルを返す複数の URL があります。ほとんどのファイルは、次のように urllib2 ライブラリを使用してダウンロードできます。

request = urllib2.urlopen(url)
zip_file = request.read()

私が抱えている問題は、ファイルの 1 つが 35Mb のサイズ (zip 形式) であり、このライブラリを使用してダウンロードを完了することができないことです。wget とブラウザを使用して通常どおりダウンロードできます。

次のようなチャンクでファイルをダウンロードしようとしました:

request = urllib2.urlopen(url)
buffers = []
while True:
    buffer = request.read(8192)
    if buffer:
        buffers.append(buffer)
    else:
        break
final_file = ''.join(buffers)

しかし、これでもダウンロードは完了しません。エラーは発生しないため、何が起こっているのかをデバッグするのは困難です。残念ながら、ここに URL/ファイルの例を投稿することはできません。

提案/アドバイスはありますか?

4

1 に答える 1

2

これは、独自の更新インストーラーをダウンロードするアプリケーションからのコピー/貼り付けです。ファイルをブロック単位で読み取り、すぐにブロックをディスク上の出力ファイルに保存します。

def DownloadThreadFunc(self):
    try:
        url = self.lines[1]
        data = None
        req = urllib2.Request(url, data, {})
        handle = urllib2.urlopen(req)

        self.size = int(handle.info()["Content-Length"])
        self.actualSize = 0
        name = path.join(DIR_UPDATES, url.split("/")[-1])
        blocksize = 64*1024

        fo = open(name, "wb")
        while not self.terminate:
            block = handle.read(blocksize)
            self.actualSize += len(block)
            if len(block) == 0:
                break
            fo.write(block)
        fo.close()
    except (urllib2.URLError, socket.timeout), e:
        try:
            fo.close()
        except:
            pass
        error("Download failed.", unicode(e))  

と を使用self.sizeself.actualSizeて、GUI スレッドでダウンロードの進行状況を表示しself.terminate、必要に応じて GUI ボタン​​からダウンロードをキャンセルします。

于 2012-04-24T20:25:30.317 に答える