Il existe encore de nombreux scénarios d'application pour les téléchargements de fichiers impliqués dans le frontal, alors combien de façons existe-t-il pour les téléchargements de fichiers frontaux ? Quels sont les avantages et les inconvénients de chaque méthode ? Présentons-les un par un.
1. une étiquette
C'est le moyen le plus simple de réaliser le téléchargement de fichiers via l'attribut a
de l'étiquette , et c'est aussi un moyen courant que nous utilisons. Regardons d'abord l'exemple de code :download
<a href="http://www.baidu.com" download="baidu.html">下载</a>
Pour l'exemple ci-dessus, nous avons cliqué sur Télécharger et avons constaté qu'il sautait sur la page d'accueil de Baidu et n'avait pas réellement téléchargé le fichier.
Étant donné que a
le téléchargement de balises ne peut télécharger que des fichiers de la même origine, s'il s'agit d'un fichier interdomaine, il inclut des fichiers multimédias tels que des images, de l'audio et de la vidéo, qui sont tous des aperçus et ne peuvent pas être téléchargés.
Le code ci-dessus consiste a
à réaliser le téléchargement du fichier directement en écrivant l'étiquette, on peut aussi js
le réaliser en écrivant, le code est le suivant :
const a = document.createElement('a')
a.href = 'http://www.baidu.com'
a.download = 'baidu.html'
a.click()
L'effet est le même que ci-dessus, tous sautent sur la page d'accueil de Baidu sans télécharger de fichiers.
Le point clé ici est l'attribut a
du label , qui vient d'être ajouté.download
HTML5
Content-Disposition
Sa fonction est de spécifier le nom du fichier téléchargé. S'il n'est pas spécifié, le nom du fichier téléchargé sera déterminé en fonction du contenu de la requête . Sinon Content-Disposition
, URL
la dernière partie de la requête sera utilisée comme nom de fichier.
2. fenêtre.ouverte
a
Le cas ci-dessus d'utilisation de balises peut également window.open
être réalisé en utilisant le même effet, le code est le suivant :
window.open('http://www.baidu.com', '_blank')
Voici _blank
la méthode d'ouverture spécifiée, si elle n'est pas spécifiée, elle sera ouverte sur la page en cours, si spécifiée ici _blank
, elle sera ouverte sur une nouvelle page.
Les attributs d' une même a
balise download
peuvent également être utilisés, le code est le suivant :
window.open('http://www.baidu.com', '_blank', 'download=baidu.html')
Bien sûr, cette méthode est également défectueuse. Par rapport aux a
balises, cette méthode ne peut pas télécharger les fichiers .html
, .htm
, .xml
, .xhtml
et autres, car ces fichiers seront html
traités comme des fichiers, ils seront donc ouverts directement sur la page en cours.
De même, les fichiers inter-domaines ne peuvent pas être téléchargés, après tout, oui window.open
, non window.download
( window.download
hypothétique).
3. location.href
Cette méthode est window.open(url)
la même que celle-là, le code est le suivant :
location.href = 'http://www.baidu.com'
Cette méthode a window.open
tous les défauts, il n'est donc pas recommandé de l'utiliser, ici c'est uniquement pour comprendre, donc je ne vais pas trop m'expliquer.
4. emplacement.? autres attributs
D'autres ici font référence aux propriétés qui peuvent accéder à la page, telles que location.assign
, location.replace
, location.reload
etc. Ces propriétés peuvent réaliser le téléchargement de fichiers. Le code est le suivant :
location.assign('http://www.baidu.com')
location.replace('http://www.baidu.com')
location.reload('http://www.baidu.com')
Là location.reload
c'est un peu spécial, sa fonction est de recharger la page en cours, mais il peut aussi accepter un paramètre, ce paramètre est la page à sauter, donc il peut aussi réaliser le téléchargement de fichier.
Bien sûr location.href
, les inconvénients de ces méthodes sont les mêmes, et il y a aussi les caractéristiques de chaque attribut.Ce n'est que pour approfondir les connaissances, pas pour trop expliquer.
5. XMLHttpRequest
Cette méthode est ce que nous appelons souvent ajax
le téléchargement, y compris axios
, fetch
etc. sont les mêmes, le code est le suivant :
const xhr = new XMLHttpRequest()
xhr.open('GET', 'http://www.baidu.com')
xhr.send()
xhr.onload = function () {
const blob = new Blob([xhr.response], { type: 'text/html' })
const a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = 'baidu.html'
a.click()
}
XMLHttpRequest
Je ne parlerai pas des connaissances connexes ici , mais seulement de la partie liée au téléchargement de fichiers.
La logique principale ici est que lorsque notre requête aboutit, nous obtenons le corps de la réponse response
, qui response
est le contenu que nous voulons télécharger, puis nous le convertissons en un blob
objet , puis URL.createObjectURL
créons un fichier via l'attribut de la baliseurl
a
download
Il y a deux points de connaissance ici, l'un est blob
l'objet et l'autre est l'objet URL.createObjectURL
.
5.1 goutte
Voici blob
la définition de l'objet, issue de MDN [2] :
Blob
L'objet représente un objet semblable à un fichier de données primitives immuables. Ses données peuvent être lues au format texte ou binaire, et peuvent également être convertiesReadableStream
pour la manipulation de données.
Blob
Ne représente pas nécessairementJavaScript
les données dans leur format natif.File
L'interface est basée surBlob
,blob
une fonctionnalité héritée de et étendue pour prendre en charge les fichiers sur le système de l'utilisateur.
blob
Object est html5
un objet nouvellement ajouté et sa fonction est de stocker des données binaires, telles que des images, des vidéos, de l'audio, etc. Son utilisation est la suivante :
/**
* @param {Array} array 二进制数据
* @param {Object} options 配置项
* @param {String} options.type 文件类型,它代表了将会被放入到 blob 中的数组内容的 MIME 类型。
* @param {String} options.endings 用于指定包含行结束符\n的字符串如何被写入。默认为transparent,表示不会修改行结束符。还可以指定为native,表示会将\n转换为\r\n。
*/
const blob = new Blob([], { type: '' })
La principale préoccupation ici est type
l'attribut. Par défaut, blob
l'objet n'a pas type
d'attribut, il s'agit donc Blob
d'un fichier sans type Blob
. Le fichier ne sera pas endommagé, mais il ne pourra pas être reconnu normalement.
5.2 URL.createObjectURL
Ce qui suit provient de MDN [3] :
La méthode statique URL.createObjectURL() crée un DOMString contenant une URL représentant l'objet donné en paramètre. La durée de vie de cette URL est liée au document dans la fenêtre qui l'a créée. Ce nouvel objet URL représente l'objet File ou l'objet Blob spécifié.
Cette méthode est utilisée pour en créer un url
. Sa fonction est de blob
convertir un objet en un seul url
. Cette méthode url
peut être utilisée pour télécharger des fichiers ou prévisualiser des fichiers. Le code est le suivant :
const url = URL.createObjectURL(blob)
Ce qu'il faut noter ici, c'est que url
le cycle de vie de ceci est lié à la fenêtre qui l'a créé document
, c'est-à-dire que lorsque la nôtre document
est détruite, celle-ci url
deviendra invalide, il faut donc la détruire au bon moment. est comme suit:
URL.revokeObjectURL(url)
Pour en revenir au problème que nous venons de télécharger, nous blob
le résolvons via des objets, mais nos type
attributs sont codés en dur. Si le type de fichier est déterminé, il n'y a pas de problème, mais si cette interface est l'interface de téléchargement de fichiers, le fichier peut y avoir sont de différents types, comment devrions-nous y faire face?
Il n'y a pas de bonne réponse ici. La première peut être négociée avec le fournisseur d'interface. Le plan de négociation est incertain. La seconde consiste à obtenir le fichier par response
son intermédiaire , c'est de cela dont nous voulons parler :header
type
const type = response.headers['content-type']
const blob = new Blob([response.data], { type })
Ici, nous le faisons response
passer par , puis créons l'objet, afin que le fichier puisse être téléchargé correctement.header
type
blob
En fait , content-type
il se peut qu'à application/octet-stream
ce moment nous devions file-type
faire passer le dossier type
.
Le code suivant est passé file-type
pour obtenir le fichiertype
:
import {fileTypeFromStream} from 'file-type';
const type = await fileTypeFromStream(response.body);
const blob = new Blob([response.data], { type })
6. Résumé
Il y a tellement de solutions ci-dessus, en fait, cela tombe toujours sur a
l'étiquette à la fin, donc qu'il soit téléchargé via le comportement intégré du navigateur ou via ajax
le téléchargement, le téléchargement final du fichier est le comportement du navigateur.
---FIN---