【python】HTTPファイルのダウンロード

6934 ワード

HTTPファイルのアップロードを実現しました。クライアントのファイルダウンロード部分をどうやって実現するかを確認します。
メインスレッドrequest
r = requests.head(url)
メインプロセスカードはrequests.headの要求にあります。
関数のスレッド呼び出し
reqHeadSize = ""
def Tre(requestUrl):
    global reqHeadSize
    reqHead = requests.head(requestUrl)
インスタンスクラスの後にスレッドが起動します。
class SubTre():
    reqHeadSize = ""
    def __init__(self):
        self.reqHeadSize = "123"

    def exec(self,requestUrl):
        reqHead = requests.head(requestUrl)
        self.reqHeadSize = int(reqHead.headers['content-length'])
スレッド起動
    tTre = SubTre()
    t = threading.Thread(target=tTre.exec, kwargs={'requestUrl': url})
    t.setDaemon(True)
    t.start()
    # t.join()
プロジェクト\static\uploads\のディレクトリに直接ファイルが格納されているので、ローカルファイルサイズを直接取得することができます。
def getFileSize(fileName):
    #        
    cwd = sys.path[1]
    #         
    filePath = cwd + "\\static\\uploads\\" + fileName
    #       
    fileSize = os.path.getsize(filePath)
    return fileSize
json joinの原理は、スレッド内のスレッドが終了したかどうかを順次チェックし、終了しないとスレッドが終了するまでブロックし、終了したら次のスレッドのjoin関数を実行します。
  • はメインプロセスをブロックし、マルチスレッド内のプログラム
  • の実行に専念する。
  • マルチスレッドマルチジョインの場合は、各スレッドのジョイン方法を順次実行し、前の終了後に次の
  • を実行することができます。
  • パラメータがないと、スレッドが終了するのを待って、次のスレッドのジョイン
  • が実行される。
  • パラメータtimeoutはスレッドのブロッキング時間であり、timeout=2はこのスレッド2 sをカバーした後、彼に関わらず、以下のコード
  • を実行し続ける。
    ダウンロード
    import sys
    import requests
    import threading
    import datetime
    
    #         ,      url
    url = sys.argv[1]
    
    
    def Handler(start, end, url, filename):
    
        headers = {'Range': 'bytes=%d-%d' % (start, end)}
        r = requests.get(url, headers=headers, stream=True)
    
        #         
        with open(filename, "r+b") as fp:
            fp.seek(start)
            var = fp.tell()
            fp.write(r.content)
    
    
    def download_file(url, num_thread = 5):
    
        r = requests.head(url)
        try:
            file_name = url.split('/')[-1]
            file_size = int(r.headers['content-length'])   # Content-Length         , http     Connection:keep-alive ,   Content-Length
        except:
            print("  URL,         ")
            return
    
        #                   
        fp = open(file_name, "wb")
        fp.truncate(file_size)
        fp.close()
    
        #         
        part = file_size // num_thread  #       ,           
        for i in range(num_thread):
            start = part * i
            if i == num_thread - 1:   #     
                end = file_size
            else:
                end = start + part
    
            t = threading.Thread(target=Handler, kwargs={'start': start, 'end': end, 'url': url, 'filename': file_name})
            t.setDaemon(True)
            t.start()
    
        #           
        main_thread = threading.current_thread()
        for t in threading.enumerate():
            if t is main_thread:
                continue
            t.join()
        print('%s     ' % file_name)
    
    if __name__ == '__main__':
        start = datetime.datetime.now().replace(microsecond=0)  
        download_file(url)
        end = datetime.datetime.now().replace(microsecond=0)
        print("  : ", end='')
        print(end-start)
    ダウンロード
        r = requests.get(url, stream=True)
        f = open("F://Penguins.jpg", "wb")
        for chunk in r.iter_content(chunk_size=512):
            if chunk:
                f.write(chunk)