


Parlez de trois méthodes de téléchargement de fichiers sans actualisation basées sur les compétences iframe, FormData et FileReader_javascript
Il existe deux façons d'envoyer une demande, l'une consiste à utiliser ajax, l'autre consiste à utiliser la soumission de formulaire. Si la soumission du formulaire par défaut n'est pas traitée, la page sera redirigée. Utilisons une démo simple pour illustrer :
html est comme indiqué ci-dessous, l'action de chemin demandée est "upload", et aucun autre traitement ne sera effectué :
<form method="POST" action="upload" enctype="multipart/form-data"> 名字 <input type="text" name="user"></input> 头像 <input type="file" name="file"></input> <input type="submit" id="_submit" value="提交"></input> </form>
La réponse du serveur (nœud) renvoie directement : "Données du formulaire reçu", la démonstration est la suivante :
Vous pouvez voir que par défaut, le formulaire demande le téléchargement et redirige vers le téléchargement en même temps. Mais dans de nombreux cas, nous espérons que la demande de formulaire ressemblera à ajax et ne redirigera pas ou n'actualisera pas la page. Comme dans le scénario ci-dessus, une fois le téléchargement terminé, l'avatar sélectionné par l'utilisateur s'affiche sur la page actuelle.
La première solution consiste à utiliser FormData de HTML5, à encapsuler les données du formulaire dans l'objet FormData, puis à les envoyer par POST. Comme indiqué dans le code suivant, répondez à l'événement click du bouton Soumettre. La ligne 6 du code obtient l'objet DOM du formulaire, puis construit une instance de FormData sur la ligne 8 et envoie les données du formulaire sur la ligne 18.
document.getElementById("_submit").onclick = function(event){ //取消掉默认的form提交方式 if(event.preventDefault) event.preventDefault(); else event.returnValue = false; //对于IE的取消方式 var formDOM = document.getElementsByTagName("form")[]; //将form的DOM对象当作FormData的构造函数 var formData = new FormData(formDOM); var req = new XMLHttpRequest(); req.open("POST", "upload"); //请求完成 req.onload = function(){ if(this.status === ){ //对请求成功的处理 } } //将form数据发送出去 req.send(formData); //避免内存泄漏 req = null; }
Une fois le téléchargement réussi, le service renverra l'adresse d'accès de l'image et ajoutera 14 lignes pour gérer la demande réussie : affichez l'image téléchargée au-dessus du bouton de soumission :
var img = document.createElement("img"); img.src = JSON.parse(this.responseText).path; formDOM.insertBefore(img, document.getElementById("_submit"));
Exemple :
Si vous utilisez jQuery, vous pouvez utiliser formData comme paramètre de données d'ajax et définir contentType: false et processData: false en même temps pour indiquer à jQuery de ne pas traiter l'en-tête de la requête et les données envoyées.
Il semble que cette méthode de soumission soit la même que l'ajax, mais ce n'est pas exactement la même. Il existe trois formats de données pour la soumission d'un formulaire. Si vous souhaitez télécharger un fichier, il doit donc être multipart/form-data. http dans la demande de soumission de formulaire ci-dessus. Le Content-Type dans les informations d'en-tête est multipart/form-data, tandis que la soumission ajax ordinaire est application/json. Le type de contenu complet soumis par le formulaire est le suivant :
"content-type": "multipart/form-data; border=------WebKitFormBoundaryYOE7pWLqdFYSeBFj"
En plus de multipart/form-data, une limite est également spécifiée. Le but de cette limite est de distinguer différents champs. Étant donné que l'objet FormData est opaque, l'appel de JSON.stringify renverra un objet vide {}. En même temps, FormData fournit uniquement la méthode append, de sorte que le contenu réel téléchargé de FormData ne peut pas être obtenu, mais il peut être visualisé à travers les données. reçus par les outils ou services d’analyse. Si vous téléchargez un fichier texte ci-dessus, le format original des données POST reçues par le service est le suivant :
------WebKitFormBoundaryYOE7pWLqdFYSeBFj
Content-Disposition : form-data; name="user"
abc
------WebKitFormBoundaryYOE7pWLqdFYSeBFj
Content-Disposition : form-data; name="file"; filename="test.txt"
Type de contenu : texte/plain
Il s'agit du contenu d'un fichier texte.
------WebKitFormBoundaryYOE7pWLqdFYSeBFj--
À partir des données reçues par le service ci-dessus, nous pouvons voir le format soumis par FormData. Chaque champ est séparé par une limite et se termine par --. Pour les requêtes ajax, le format de données envoyé est personnalisé, généralement avec clé=valeur et un & au milieu :
var req = new XMLHttpRequest(); var sendData = "user=abc&file=这是一个文本文件的内内容"; req.open("POST", "upload"); //发送的数据需要转义,见上面提到的三种格式 req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.send(sendData);
服务就会收到和send发出去的字符串一模一样的内容,然后再作参数解析,所以就得统一参数的格式:
user=abc&file=这是一个文本文件的内容
从这里可以看出POST本质上并不比GET安全,POST只是没有将数据放在网址传送而已。
考虑到FormData到了IE10才支持,如果要支持较低版本的IE,那么可以借助iframe。
文中一开始就说,默认的form提交会使页面重定向,而重定向的规则在target中指定,可以和a标签一样指定为"_blank",在新窗口中打开;还可以指定为一个iframe,在该iframe中打开。所以可以弄一个隐藏的iframe,将form的target指向这个iframe,当form请求完成时,返回的数据就会由这个iframe显示,正如上面在新页面显示的:"Recieved form data"。请求完成后,iframe加载完成,触发load事件,在load事件的处理函数里,获取该iframe的内容,从而拿到服务返回的数据了!拿到后再把iframe删掉。
在提交按钮的响应函数里,首先创建一个iframe,设置iframe为不可见,然后再添加到文档里:
var iframe = document.createElement("iframe"); iframe.width = 0; iframe.height = 0; iframe.border = 0; iframe.name = "form-iframe"; iframe.id = "form-iframe"; iframe.setAttribute("style", "width:0;height:0;border:none"); //放到document this.form.appendChild(iframe);
改变form的target为iframe的name值:
this.form.target = "form-iframe";
然后再响应iframe的load事件:
iframe.onload = function(){ var img = document.createElement("img"); //获取iframe的内容,即服务返回的数据 var responseData = this.contentDocument.body.textContent || this.contentWindow.document.body.textContent; img.src = JSON.parse(responseData).path; f.insertBefore(img, document.getElementById("_submit")); //删掉iframe setTimeout(function(){ var _frame = document.getElementById("form-iframe"); _frame.parentNode.removeChild(_frame); }, 100); //如果提示submit函数不存在,请注意form里面是否有id/value为submit的控件 this.form.submit(); }
第二种办法到这里就基本可以了,但是如果看163邮箱或者QQ邮箱上传文件的方式,会发现和上面的两种方法都不太一样。用httpfox抓取请求的数据,会发现上传的内容的格式并不是上面说的用boundary隔开,而是直接把文件的内容POST出去了,而文件名、文件大小等相关信息放在了文件的头部。如163邮箱:
POST Data:
this is a text
Headers:
Mail-Upload-name: content.txt
Mail-Upload-size: 15
可以推测它们应该是直接读取了input文件的内容,然后直接POST出去了。要实现这样的功能,可以借助FileReader,读取input文件的内容,再保留二进制的格式发送出去:
var req = new XMLHttpRequest(); req.open("POST", "upload"); //设置和邮箱一样的Content-Type req.setRequestHeader("Content-Type", "application/octet-stream"); var fr = new FileReader(); fr.onload = function(){ req.sendAsBinary(this.result); } req.onload = function(){ //一样,省略 } //读取input文件内容,放到fileReader的result字段里 fr.readAsBinaryString(this.form["file"].files[0]);
代码第13行执行读文件,读取完毕后触发第6行的load响应函数,第7行以二进制文本形式发送出去。由于sendAsBinary的支持性不是很好,可以自行实现一个:
if(typeof XMLHttpRequest.prototype.sendAsBinary === 'undefined'){ XMLHttpRequest.prototype.sendAsBinary = function(text){ var data = new ArrayBuffer(text.length); var uia = new UintArray(data, ); for (var i = ; i < text.length; i++){ uia[i] = (text.charCodeAt(i) & xff); } this.send(uia); } }
代码的关键在于第6行,将字符串转成8位无符号整型,还原二进制文件的内容。在执行了fr.readAsBinaryString之后,二进制文件的内容将会以utf-8的编码以字符串形式存放到result,上面的第6行代码将每个unicode编码转成整型(&0xff或者parseInt),存放到一个8位无符号整型数组里面,第8行把这个数组发送出去。如果直接send,而不是sendAsBinary,服务收到的数据将无法正常还原成原本的文件。
上面的实现需要考虑文件太大,需分段上传的问题。
关于FileReader的支持性,IE10以上支持,IE9有另外一套File API。
文章讨论了3种办法实现无刷新上传文件,分别是使用iframe、FormData和FileReader,支持性最好是的iframe,但是从体验的效果来看FormData和FileReader更好,因为这两者不用生成一个无用的DOM再删除,其中FormData最简单,而FileReader更加灵活。
下面给大家介绍iframe无刷新上传文件
form.html <form enctype="multipart/form-data" method="post" target="upload" action="upload.php" > <input type="file" name="uploadfile" /> <input type="submit" /> </form> <iframe name="upload" style="display:none"></iframe>

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les frames en ligne sont appelés iframes en HTML. Une étiquette spécifie une zone rectangulaire dans le contenu où le navigateur peut afficher différents documents avec des barres de défilement et des bordures. Pour intégrer un autre document dans le document HTML actuel, utilisez des cadres en ligne. Une référence à un élément peut être spécifiée à l'aide de l'attribut de nom HTMLiframe. En JavaScript, les références aux éléments sont également faites à l'aide de l'attribut name. Une iframe est essentiellement utilisée pour afficher une page Web dans la page Web actuellement affichée. L'URL du document contenant l'iframe est spécifiée à l'aide de l'attribut "src". Syntaxe Voici la syntaxe du HTML <iframesrc="URL"title="d

Les raisons du chargement lent des iframes incluent principalement le retard du réseau, le long temps de chargement des ressources, l'ordre de chargement, le mécanisme de mise en cache et la politique de sécurité. Introduction détaillée : 1. Délai du réseau Lorsque le navigateur charge une page Web contenant une iframe, il doit envoyer une requête au serveur pour obtenir le contenu de l'iframe. Si le délai du réseau est élevé, le délai d'obtention du contenu sera élevé. augmenter, entraînant un chargement lent de l'iframe. ; 2. Lorsque le temps de chargement de la ressource est long, la taille de la ressource est grande ou le temps de réponse du serveur est long, la vitesse de chargement sera évidemment plus lente 3. Séquence de chargement, etc.

Le data-id dans une iframe fait référence à un attribut personnalisé utilisé dans les balises HTML pour stocker l'identifiant d'un élément spécifique. En utilisant l'attribut data-id, vous pouvez ajouter un identifiant unique à l'élément iframe afin qu'il puisse être manipulé et accessible en JavaScript. La dénomination de l'attribut data-id peut être personnalisée en fonction de besoins spécifiques, mais certaines conventions de dénomination sont généralement suivies pour garantir son unicité et sa lisibilité. L'attribut data-id peut également être utilisé pour identifier et manipuler une iframe spécifique.

Microsoft Outlook télécharge un fichier mystérieux appelé « TokenFactoryIframe » sur macOS lorsque les utilisateurs accèdent au service de messagerie via Safari. Ce problème a désormais été largement signalé par les utilisateurs qui ont découvert les fichiers « TokenFactoryIframe » qu'Outlook télécharge à chaque visite. Outlook télécharge ce mystérieux fichier toutes les quelques secondes ou au moins chaque fois que vous accédez à Outlook sur les plateformes Apple. D'après nos conclusions, cela semble être un problème causé par une mise à jour incorrecte côté serveur publiée sur Outlook et n'a rien à voir avec Safari ou macOS. Microsoft dans une copie

Les technologies qui peuvent remplacer les iframes incluent Ajax, les bibliothèques ou frameworks JavaScript, les technologies de composants Web, le routage frontal et le rendu côté serveur. Introduction détaillée : 1. Ajax est une technologie utilisée pour créer des pages Web dynamiques. Il peut réaliser des mises à jour asynchrones de la page en échangeant des données avec le serveur en arrière-plan sans actualiser la page entière. L'utilisation d'Ajax peut charger et afficher le contenu de manière plus flexible, et il n'est pas nécessaire d'utiliser iframe pour intégrer d'autres pages ; ou un framework , comme React et ainsi de suite.

Les événements de chargement de l'iframe incluent l'événement onload, l'événement onreadystatechange, l'événement onbeforeunload, l'événement onerror, l'événement onabort, etc. Description détaillée : 1. événement onload, spécifiant le code JavaScript à exécuter après le chargement de l'iframe ; 2. événement onreadystatechange, spécifiant le code JavaScript à exécuter lorsque l'état de l'iframe change, etc.

iframe en Python est une balise HTML utilisée pour intégrer une autre page Web ou un autre document dans une page Web. En Python, vous pouvez utiliser diverses bibliothèques et frameworks pour traiter et manipuler les iframes, dont la plus couramment utilisée est la bibliothèque BeautifulSoup, qui peut facilement extraire le contenu d'une iframe d'une page Web et le manipuler et le traiter. Savoir comment gérer et manipuler les iframes est extrêmement utile à la fois pour le développement Web et pour le scraping de données.

Les dangers liés aux iframes incluent principalement : 1. Les vulnérabilités de sécurité peuvent charger d'autres pages Web via des iframes et mener certaines attaques ; 2. Une percée de la politique de même origine en chargeant des pages Web sous d'autres noms de domaine dans des iframes. la politique d'origine peut être violée. Stratégie pour parvenir à une communication inter-domaines, qui peut être attaquée de manière malveillante ; 3. Problèmes d'exécution de code, les pages Web chargées dans les iframes peuvent exécuter du code JS, ce qui peut entraîner des problèmes de sécurité. 4. Problèmes de référencement, moteurs de recherche ; il se peut que vous ne puissiez pas analyser et indexer correctement le contenu chargé via iframe et plus encore.
