J'ai du mal à trouver de la documentation ou des exemples de mise en œuvre d'un indicateur de progression de téléchargement à l'aide de fetch .
C'est la seule référence que j'ai trouvée jusqu'à présent , qui indique:
Les événements de progression sont une fonctionnalité de haut niveau qui n'arrivera pas dans la récupération pour le moment. Vous pouvez créer le vôtre en regardant l'en-
Content-Length
tête et en utilisant un flux d'intercommunication pour surveiller les octets reçus.Cela signifie que vous pouvez gérer explicitement les réponses sans
Content-Length
autre. Et bien sûr, même siContent-Length
c'est là, ça peut être un mensonge. Avec les flux, vous pouvez gérer ces mensonges comme vous le souhaitez.
Comment pourrais-je écrire "un flux de passage pour surveiller les octets" envoyés? Si cela fait une différence, j'essaie de le faire pour alimenter les téléchargements d'images du navigateur vers Cloudinary .
REMARQUE : je ne suis pas intéressé par la bibliothèque Cloudinary JS , car elle dépend de jQuery et mon application ne le fait pas. Je ne suis intéressé que par le traitement de flux nécessaire pour ce faire avec le javascript natif et le fetch
polyfill de Github .
la source
Réponses:
Les flux commencent à débarquer sur la plate-forme Web ( https://jakearchibald.com/2016/streams-ftw/ ) mais il n'en est encore qu'à ses débuts.
Bientôt, vous serez en mesure de fournir un flux comme corps d'une requête, mais la question ouverte est de savoir si la consommation de ce flux est liée aux octets téléchargés.
Des redirections particulières peuvent entraîner la retransmission des données vers le nouvel emplacement, mais les flux ne peuvent pas «redémarrer». Nous pouvons résoudre ce problème en transformant le corps en un rappel qui peut être appelé plusieurs fois, mais nous devons nous assurer que le fait d'exposer le nombre de redirections n'est pas une fuite de sécurité, car ce serait la première fois que JS pourrait détecter ça.
Certains se demandent s'il est même judicieux de lier la consommation de flux aux octets téléchargés.
En bref: ce n'est pas encore possible, mais à l'avenir, cela sera géré soit par des flux, soit par une sorte de rappel de niveau supérieur transmis
fetch()
.la source
Ma solution est d'utiliser axios , qui prend en charge cela assez bien:
J'ai un exemple d'utilisation de ceci dans react on github.
la source
axios
utilisationfetch
ouXMLHttpRequest
sous le capot?axios
qu'il ne s'utilise pasfetch
sous le capot, et n'a pas un tel support. Je suis littéralement en train de l' écrire maintenant pour eux.Je ne pense pas que ce soit possible. Le projet déclare:
(ancienne réponse):
Le premier exemple du chapitre Fetch API donne un aperçu de la façon de:
Outre leur utilisation de l'
Promise
anti - modèle du constructeur , vous pouvez voir queresponse.body
s'agit d'un Stream à partir duquel vous pouvez lire octet par octet en utilisant un lecteur, et vous pouvez déclencher un événement ou faire ce que vous voulez (par exemple enregistrer la progression) pour chacun d'eux.Cependant, la spécification Streams ne semble pas être tout à fait terminée, et je n'ai aucune idée si cela fonctionne déjà dans une implémentation de récupération.
la source
fetch
. Je suis intéressé par les indicateurs de progression pour le téléchargement d' un fichier.Promise
constructeur n'est pas nécessaire.Response.body.getReader()
renvoie unPromise
. Voir Comment résoudre Uncaught RangeError lors du téléchargement de json de grande taillegetReader
ne retourne pas une promesse. Aucune idée de ce que cela a à voir avec le message que vous avez lié..getReader()
La.read()
méthode de retour aPromise
. C'est ce que nous essayions de transmettre. Le lien fait allusion à la prémisse que si la progression peut être vérifiée pour le téléchargement, la progression peut être vérifiée pour le téléchargement. Mettre en place un modèle qui renvoie le résultat attendu, à un degré appréciable; c'est la progression dufetch()
téléchargement. Je n'ai pas trouvé de chemin versecho
un objetBlob
ouFile
à jsfiddle, manquant probablement quelque chose de simple. Test deslocalhost
fichiers téléchargés très rapidement, sans imiter les conditions du réseau; bien que juste rappeléNetwork throttling
.Mise à jour: comme le dit la réponse acceptée, c'est impossible maintenant. mais le code ci-dessous a géré notre problème pendant un certain temps. Je dois ajouter qu'au moins nous avons dû passer à l'utilisation d'une bibliothèque basée sur XMLHttpRequest.
grâce à ce lien: https://jakearchibald.com/2016/streams-ftw/
la source
content-length
! == longueur du corps. Lorsque la compression http est utilisée (courante pour les gros téléchargements), la longueur du contenu est la taille après la compression http, tandis que la longueur est la taille après l'extraction du fichier.Puisque aucune des réponses ne résout le problème.
Juste pour des raisons de mise en œuvre, vous pouvez détecter la vitesse de téléchargement avec un petit morceau initial de taille connue et le temps de téléchargement peut être calculé avec la longueur du contenu / la vitesse de téléchargement. Vous pouvez utiliser ce temps comme estimation.
la source
Une solution de contournement possible serait d'utiliser
new Request()
constructeur puis de vérifier l'Request.bodyUsed
Boolean
attributpour déterminer si le flux est
distributed
Renvoie l' appel de l'
fetch()
Promise
intérieur.then()
enchaîné à l'.read()
appel récursif d'unReadableStream
quandRequest.bodyUsed
est égal àtrue
.Notez que l'approche ne lit pas les octets de
Request.body
car les octets sont transmis au point de terminaison. En outre, le téléchargement peut se terminer bien avant que toute réponse ne soit renvoyée dans son intégralité au navigateur.la source
la source
L'élément clé est ReadableStream ≪ obj_response .body≫.
Échantillon:
Vous pouvez tester son exécution sur une grande page, par exemple https://html.spec.whatwg.org/ et https://html.spec.whatwg.org/print.pdf . CtrlShiftJ et chargez le code dans.
(Testé sur Chrome.)
la source