ConnectionResetError: Une connexion existante a dû être fermée par l'hôte distant

Je suis en train de travailler sur un script pour télécharger un groupe de fichiers. J'ai terminé cette, et il fonctionne correctement. Maintenant, j'ai essayé d'ajouter une dynamique impression de la progression du téléchargement.

Pour les petits téléchargements (c'est d' .les fichiers mp4) comme 5MO, la progression fonctionne très bien et le fichier se ferme correctement, entraînant ainsi une complète et travailler de téléchargement .fichier mp4. Pour les gros fichiers, tels que 250 MO et au-dessus, cela ne fonctionne pas correctement, j'obtiens l'erreur suivante:

ConnectionResetError: Une connexion existante a dû être fermée par l'hôte distant

Et voici mon code:

import urllib.request
import shutil
import os
import sys
import io

script_dir = os.path.dirname('C:/Users/Kenny/Desktop/')
rel_path = 'stupid_folder/video.mp4'
abs_file_path = os.path.join(script_dir, rel_path)
url = 'https://archive.org/download/SF145/SF145_512kb.mp4'
# Download the file from `url` and save it locally under `file_name`:

with urllib.request.urlopen(url) as response, open(abs_file_path, 'wb') as out_file:

    eventID = 123456

    resp = urllib.request.urlopen(url)
    length = resp.getheader('content-length')
    if length:
        length = int(length)
        blocksize = max(4096, length//100)
    else:
        blocksize = 1000000 # just made something up

    # print(length, blocksize)

    buf = io.BytesIO()
    size = 0
    while True:
        buf1 = resp.read(blocksize)
        if not buf1:
            break
        buf.write(buf1)
        size += len(buf1)
        if length:
            print('\r[{:.1f}%] Downloading: {}'.format(size/length*100, eventID), end='')#print('\rDownloading: {:.1f}%'.format(size/length*100), end='')
    print()

    shutil.copyfileobj(response, out_file)

Cela fonctionne parfaitement avec les petits fichiers, mais plus ceux que je reçois l'erreur. Maintenant, je ne reçois PAS l'erreur, cependant, avec de gros fichiers si je commente la progrès indicateur de code:

with urllib.request.urlopen(url) as response, open(abs_file_path, 'wb') as out_file:

    # eventID = 123456
    # 
    # resp = urllib.request.urlopen(url)
    # length = resp.getheader('content-length')
    # if length:
    #     length = int(length)
    #     blocksize = max(4096, length//100)
    # else:
    #     blocksize = 1000000 # just made something up
    # 
    # # print(length, blocksize)
    # 
    # buf = io.BytesIO()
    # size = 0
    # while True:
    #     buf1 = resp.read(blocksize)
    #     if not buf1:
    #         break
    #     buf.write(buf1)
    #     size += len(buf1)
    #     if length:
    #         print('\r[{:.1f}%] Downloading: {}'.format(size/length*100, eventID), end='')#print('\rDownloading: {:.1f}%'.format(size/length*100), end='')
    # print()

    shutil.copyfileobj(response, out_file)

Quelqu'un a une idée? C'est la dernière partie de mon projet et je voudrais vraiment être en mesure de voir les progrès. Encore une fois, c'est Python 3.5. Merci pour toute aide!

Je ne comprends pas: vous lisez à partir de resp ET de response ? pour quoi? Une fois que vous avez écrit dans buf complètement, il semble que vous avez terminé? ou je me trompe? vous pouvez écrire directement à out_file BTW.
En toute honnêteté, je ne sais pas ce que je fais. Mais si je ne comprend pas shutil.copyfileobj(response, out_file) ensuite le fichier téléchargé reste 0 octets.
juste essayer out_file.write(buf1) au lieu de buf.write(buf1) dans votre boucle. Vous n'avez pas besoin que io.BytesIO objet.
Et avec ça, ai-je toujours besoin shutil.copyfileobj(response, out_file) ou devrait-il fonctionner correctement?
non, pas besoin de copyfileobj. Il serait déjà copié.

OriginalL'auteur Kenny | 2016-12-12