Heim > Web-Frontend > js-Tutorial > Hauptteil

jquery+HTML5+Ajax implementiert die Datei-Upload-Funktion mit Fortschrittsbalken

php中世界最好的语言
Freigeben: 2018-04-23 14:53:31
Original
1722 Leute haben es durchsucht

Dieses Mal bringen wir Ihnen jquery+HTML5+Ajax, um die Funktion Datei-Upload mit einem Fortschrittsbalken zu implementieren. jquery+HTML5+Ajax implementiert die zu beachtenden HinweiseWas sind sie? Hier sind praktische Fälle.

Zunächst verwendet HTML5 AJAX zum Übermitteln von Daten. Zuerst müssen Sie ein neues Objekt lernen, das in HTML5 hinzugefügt wurde: FormData

Das FormData-Objekt kann die Append-Methode verwenden, um Schlüsselwertdaten hinzuzufügen , was sich von dem JSON unterscheidet, das wir zuvor üblicherweise verwendet haben. Es ist möglich, dass Binärdateien asynchron hochgeladen werden können.

1. Erstellung des FormDate-Objekts

var formData = new FormData();
Nach dem Login kopieren

2. Hinzufügen von Daten zum FormDate-Objekt

formData.append("catname", "我是一只喵");
formData.append("age", 1);         // 数字类型会转为字符串类型
// 可以增加上传的二进制文件,比如fileInputElement对象中已经包含了用户所选择的文件
formData.append("userfile", fileInputElement.files[0]);
//也可以将一个 Blob 对象添加到 formData 中
var oFileBody = "<a id="a"><b id="b">hey!</b></a>"; 
var oBlob = new Blob([oFileBody], { type: "text/xml"});
formData.append("webmasterfile", oBlob);
Nach dem Login kopieren

3. Verwenden Sie das FormData-Objekt

var xhr = new XMLHttpRequest();
xhr.open("POST", "upload");
xhr.send(formData);
Nach dem Login kopieren

HTML-Teil

Nach der kurzen Einführung des FormData-Objekts werfen wir einen Blick auf das HTML Code der Seite. So schreiben Sie

<img width="400" height="250"/><br /> 
<input type="file" id="pic" name="pic" onchange="showPic()"/>
<input type="button" value="上传图片" onclick="uploadFile()" /><br /> 
<p id="parent">
 <p id="son"></p>
</p>
Nach dem Login kopieren

Das p unten wird zur Anzeige des Fortschrittsbalkens verwendet, daher ist der entsprechende CSS-Stil erforderlich. Der Stil ist wie folgt, die Farbe sieht nicht gut aus, ändern Sie sie selbst:

<style type="text/css"> 
 #parent{width:550px; height:10px; border:2px solid #09F;} 
 #son {width:0; height:100%; background-color:#09F; text-align:center; line-height:10px; font-size:20px; font-weight:bold;} 
</style>
Nach dem Login kopieren

JS-Teil

Das Highlight ist hier Nach dem Laden von jquery Schauen wir uns die Seite an, schauen wir uns das JavaScript an. Ja, wie man es schreibt, zuerst ist die onchange-Ereignismethode der Dateikomponente:

function showPic(){
 var pic = $("#pic").get(0).files[0];
 $("img").prop("src" , window.URL.createObjectURL(pic) );
}
Nach dem Login kopieren

Die erste Zeile von showPic dient dazu, die hochgeladene Datei aus dem Dateiobjekt abzurufen . Die zweite Zeile legt das src-Attribut für img fest. Sie können eine sofortige Vorschau des Effekts auf der Seite erhalten.

Bevor wir uns die Methode uploadFile ansehen, wollen wir kurz etwas über den Fortschritt von Fortschrittsereignissen (Progress Events) erfahren...

Die Progress Events-Spezifikation ist ein Arbeitsentwurf des W3C, definierte Ereignisse im Zusammenhang mit der Client-Server-Kommunikation. Diese Ereignisse waren ursprünglich auf XHR-Operationen ausgerichtet, werden aber mittlerweile auch von anderen APIs verwendet. Es gibt die folgenden 6 Fortschrittsereignisse.

loadstart: Wird ausgelöst, wenn das erste Byte der entsprechenden Daten empfangen wird.
Fortschritt: Wird kontinuierlich während des Zeitraums des Empfangs der Antwort ausgelöst. // Schauen wir uns nur einen
Fehler an: Wird ausgelöst, wenn in der Anfrage ein Fehler auftritt.
abort: Wird ausgelöst, wenn der Link aufgrund des Aufrufs der abort()-Methode beendet wird.
Laden: Wird ausgelöst, wenn die entsprechenden Daten vollständig empfangen wurden.
Loadend: Wird ausgelöst, nachdem die Kommunikation abgeschlossen ist oder ein Fehler-, Abbruch- oder Ladeereignis ausgelöst wird.

Das Fortschrittsereignis wird von Mozilla übermittelt. Dieses Ereignis wird regelmäßig ausgelöst, während der Browser neue Daten empfängt. Das onprogress-Ereignishandlerprogramm empfängt ein Ereignisobjekt, dessen Zielattribut ein XHR-Objekt ist, aber drei zusätzliche Attribute enthält:

lengthComputable: ein boolescher Wert, der angibt, ob Fortschrittsinformationen verfügbar sind

Position: Gibt die Anzahl der empfangenen Bytes an

totalSize: Gibt die erwartete Anzahl von Bytes an, die basierend auf dem entsprechenden Content-Length-Header ermittelt wird.

Mit diesen Informationen können wir eine Fortschrittsanzeige für den Benutzer erstellen. Aber das Problem tritt erneut auf: Die Ajax-Methode von jQuery hat keine Operationen für das Fortschrittsereignis. Wie funktioniert das?~

Glücklicherweise habe ich durch Konsultation der Informationen herausgefunden, dass das XMLHttpRequest-Objekt, das von der Ajax-Methode von jQuery aufgerufen wird, angegeben werden kann! ! !

Schauen Sie sich Zeile 8453 an, das ist alles. Daher erhält der Code im Ajax-Teil der uploadFile-Methode diesen Stil.

Der wichtigste Teil des Codes:

function uploadFile(){
  
  // 获取上传文件,放到 formData对象里面
  var pic = $("#myhead").get(0).files[0];
  var formData = new FormData();
 formData.append("file" , pic);
  $.ajax({
    type: "POST",
    url: "upload",
    data: formData ,  //这里上传的数据使用了formData 对象
    processData : false, 
    //必须false才会自动加上正确的Content-Type 
    contentType : false , 
    
    //这里我们先拿到jQuery产生的 XMLHttpRequest对象,为其增加 progress 事件绑定,然后再返回交给ajax使用
    xhr: function(){
      var xhr = $.ajaxSettings.xhr();
      if(onprogress && xhr.upload) {
        xhr.upload.addEventListener("progress" , onprogress, false);
        return xhr;
      }
    } 
  });
}
Nach dem Login kopieren

Fügen Sie abschließend die onprogress-Methode hinzu, um die gesamte Funktion abzuschließen.

/**
 * 侦查附件上传情况 ,这个方法大概0.05-0.1秒执行一次
 */
function onprogress(evt){
  var loaded = evt.loaded;     //已经上传大小情况 
 var tot = evt.total;      //附件总大小 
 var per = Math.floor(100*loaded/tot);  //已经上传的百分比 
  $("#son").html( per +"%" );
 $("#son").css("width" , per +"%");
}
Nach dem Login kopieren

Zuletzt ist zum einfachen Vergleich der Code der gesamten Seite beigefügt.

<!DOCTYPE html>
<html>
 <head>
 <title>html5_2.html</title>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 <style type="text/css"> 
  #parent{width:550px; height:10px; border:2px solid #09F;} 
  #son {width:0; height:100%; background-color:#09F; text-align:center; line-height:10px; font-size:20px; font-weight:bold;} 
 </style>
 <script type="text/javascript" src="js/jquery-1.9.1.js"></script>
 <script type="text/javascript">
 function showPic(){
  var pic = $("#pic").get(0).files[0];
  $("img").prop("src" , window.URL.createObjectURL(pic) );
  uploadFile();
 }
 function uploadFile(){
  var pic = $("#pic").get(0).files[0];
  var formData = new FormData();
  formData.append("file" , pic);
  /** 
   * 必须false才会避开jQuery对 formdata 的默认处理 
   * XMLHttpRequest会对 formdata 进行正确的处理 
   */ 
  $.ajax({
   type: "POST",
   url: "upload",
   data: formData ,
   processData : false, 
   //必须false才会自动加上正确的Content-Type 
   contentType : false , 
   xhr: function(){
    var xhr = $.ajaxSettings.xhr();
    if(onprogress && xhr.upload) {
     xhr.upload.addEventListener("progress" , onprogress, false);
     return xhr;
    }
   } 
  });
 }
 /**
  * 侦查附件上传情况 ,这个方法大概0.05-0.1秒执行一次
  */
 function onprogress(evt){
  var loaded = evt.loaded;     //已经上传大小情况 
  var tot = evt.total;      //附件总大小 
  var per = Math.floor(100*loaded/tot);  //已经上传的百分比 
  $("#son").html( per +"%" );
  $("#son").css("width" , per +"%");
 }
 </script>
 </head>
 <body>
 <img width="400" height="250"/><br /> 
 <input type="file" id="pic" name="pic" onchange="showPic()"/>
 <input type="button" value="上传图片" onclick="uploadFile()" /><br /> 
 <p id="parent">
  <p id="son"></p>
 </p> 
 </body>
</html>
Nach dem Login kopieren

Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website.

Empfohlene Lektüre:

Detaillierte Erläuterung der Schritte zum Implementieren des Datei-Uploads mit Jquery+LigerUI

Detaillierte Erläuterung von jquery dynamisches Laden von JS-Dateien

So lesen Sie XML-Dateiinhalte mit jQuery

Das obige ist der detaillierte Inhalt vonjquery+HTML5+Ajax implementiert die Datei-Upload-Funktion mit Fortschrittsbalken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage