","image":"http://www.luping.net/uploads/20241104/17307198076728b03faccae.jpg","datePublished":"2024-11-08T22:31:00+08:00","dateModified":"2024-11-08T22:31:00+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment lire et faire écho à la taille en cours d'écriture du fichier téléchargé sur le serveur en temps réel sans bloquer le serveur et le client ?

Comment lire et faire écho à la taille en cours d'écriture du fichier téléchargé sur le serveur en temps réel sans bloquer le serveur et le client ?

Publié le 2024-11-08
Parcourir:379

How to Read and Echo Currently Writing Size of Uploaded File in Server in Realtime Without Blocking Server and Client?

Comment lire et imprimer la taille d'un fichier téléchargé en cours d'écriture côté serveur en temps réel sans bloquer le serveur et le client ?

Développons ce problème :

Afin d'obtenir la progression du téléchargement du fichier en temps réel, nous le définissons à partir de l'objet Blob, File, TypedArray ou ArrayBuffer via fetch () dans la requête POST L'objet body.

L'implémentation actuelle définit l'objet File comme deuxième argument de fetch() transmis à l'objet body.

Exigences :

en tant que flux de texte/événement lit la taille du fichier en cours d'écriture sur le système de fichiers du serveur et la renvoie au client. S'arrête lorsque tous les octets fournis par le paramètre de chaîne de requête var dans la requête GET ont été écrits. La lecture des fichiers s'effectue actuellement dans un environnement de script distinct, dans lequel les appels GET sont effectués vers le script qui lit le fichier, puis le POST est effectué vers le script qui écrit le fichier sur le serveur.

Attendez d'avoir terminé la section d'écho de la taille du fichier avant d'essayer de résoudre les problèmes potentiels liés à la gestion des écritures de fichiers ou des lectures de fichiers côté serveur pour obtenir la taille actuelle du fichier.

J'essaie actuellement d'utiliser php pour répondre aux exigences. Mais aussi intéressé par c, bash, nodejs, python ou d'autres langages ou méthodes pouvant être utilisés pour effectuer la même tâche.

La partie javascript côté client convient. Je ne connais tout simplement pas bien PHP (l'un des langages côté serveur les plus utilisés au monde) pour implémenter le modèle sans inclure de parties inutiles.

Motivation :

Indicateur de progression pour la récupération ?

Connexe :

Récupérer avec ReadableStream

Problème :

Get

PHP Notice:  Undefined index: HTTP_LAST_EVENT_ID in stream.php on line 7

dans le terminal.

De plus, si

while(file_exists($_GET["filename"]) 
  && filesize($_GET["filename"]) < intval($_GET["filesize"]))

est remplacé par

while(true)

Cela générera une erreur au niveau de l'EventSource.

Sans l'appel sleep(), la taille de fichier correcte est distribuée à l'événement de message pour un fichier de taille 3,3 Mo, 3321824, 61921, 26214 et 38093 sont imprimés respectivement lorsque le même fichier est téléchargé trois fois. Le résultat attendu est d'obtenir la taille du fichier lors de l'écriture d'un fichier à :

stream_copy_to_stream($input, $file);

au lieu de la taille du fichier de l'objet fichier téléchargé. Est-ce que fopen() ou stream_copy_to_stream() empêchera d'autres processus php d'accéder à stream.php ?

Choses essayées jusqu'à présent :

php Citation de

  • Au-delà de $_POST, $_GET et $_FILE : dans JavaScriptPHP Processing Blob
  • Introduction aux événements envoyés par le serveur avec un exemple PHP

php

// 能否合并 `data.php`、`stream.php` 为同一个文件?
// 能否使用 `STREAM_NOTIFY_PROGRESS` 
// "Indicates current progress of the stream transfer 
// in bytes_transferred and possibly bytes_max as well" to read bytes?
// do we need to call `stream_set_blocking` to `false`
// data.php
// stream.php

javascript









Déclaration de sortie Cet article est réimprimé à l'adresse : 1729432843. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3