Lorsque vous travaillez avec des téléchargements de fichiers volumineux dans des applications Web, l'un des problèmes courants auxquels les développeurs sont confrontés est les délais d'attente, le temps de réponse et les erreurs de surcharge de mémoire. La plupart des serveurs Web et des clients ont des limites quant à la durée d'attente d'une réponse, et si le processus de téléchargement prend trop de temps, vous pourriez rencontrer ces erreurs. Pour atténuer cela, les téléchargements en streaming constituent une solution plus efficace et évolutive.
Dans cet article, nous explorerons comment l'utilisation des capacités de streaming de Python pour gérer les téléchargements de fichiers volumineux peut aider à éviter les délais d'attente et les erreurs de réponse. Plus précisément, nous discuterons des téléchargements fragmentés, de leur fonctionnement et de la manière dont ils peuvent optimiser les performances lors du traitement de fichiers volumineux.
Lorsqu'un utilisateur demande un fichier volumineux, votre serveur Web doit :
Bien que ce processus semble simple, il devient problématique à mesure que la taille du fichier augmente. Les problèmes que vous pourriez rencontrer incluent :
Solution : diffusez le fichier en morceaux, permettant au serveur de gérer le fichier en morceaux plus petits et gérables, réduisant ainsi les risques de ces problèmes.
Au lieu de lire l'intégralité du fichier en mémoire et de l'envoyer en une seule réponse volumineuse, le streaming divise le fichier en morceaux plus petits qui sont lus et transmis séquentiellement. Cela permet au client de commencer à recevoir des parties du fichier plus tôt, plutôt que d'attendre que l'intégralité du fichier soit chargée avant le début de la transmission.
Voici pourquoi le streaming est bénéfique :
supposons que vous souhaitiez télécharger les fichiers depuis Google Drive ou tout autre stockage comme SharePoint, GoogleCloudStorage, etc. nous pouvons utiliser des générateurs pour le téléchargement de fichiers fragmentés, voici à quoi cela ressemblera.
GoogleDrive: def generate_chunks(request, chunksize = 10 * 1024 * 1024): #10MB file_buffer = io.BytesIO() downloader = MediaIoBaseDownload(file_buffer, request, chunksize=chunksize) done = False previous_bytes = 0 while not done: status, done = downloader.next_chunk() if status: new_bytes = downloader._progress - previous_bytes file_buffer.seek(previous_bytes) chunk_data = file_buffer.read(new_bytes) previous_bytes = downloader._progress yield chunk_data def file_loader(user_name, file_properties, credentials): file_uri = file_properties["file_uri"] # Your logic from Google Drive Doc to authenticate the user # and getting the file in request request = service.files().get_media(fileId=file_uri) return lambda: GoogleDrive.generate_chunks(request)
Pour le téléchargement du flux, vous devez gérer la réponse comme ceci
file = GoogleDrive.file_loader(user_name, file_properties, credentials) response = Response(file(), content_type='application/octet-stream') filename = "some example file.mp4" response.headers['Content-Disposition'] = f"attachment; filename*=UTF-8''{quote(filename)}" return response
Inclure le nom de fichier dans le format correct pour l'encodage UTF-8 aidera à éviter les problèmes lorsqu'il y a des emoji ou des caractères spéciaux dans le nom de fichier au cas où vous utilisez la dénomination de fichier dynamique à partir de la base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!