Maison  >  Article  >  interface Web  >  Nouvelles fonctionnalités HTML5 : opérations sur les fichiers et les données binaires

Nouvelles fonctionnalités HTML5 : opérations sur les fichiers et les données binaires

黄舟
黄舟original
2017-03-30 13:02:352791parcourir

Historiquement, JavaScript ne peut pas gérer les données binaires. Si elles doivent être traitées, seul Vous peut utiliser la méthode charCodeAt() pour convertir le codage de texte en données binaires octet par octet. Une autre façon consiste à convertir les données binaires en codage Base64, puis à les traiter. Ces deux méthodes sont non seulement lentes, mais également sujettes aux erreurs. Un objet est introduit, permettant une manipulation directe des données binaires. L'

objet Bolb est un objet de base représentant des données binaires. Sur cette base, une série d' API, utilisé pour exploiter les fichiers

Objet Blob

Blob (Binary Large

Object) L'objet représente un élément de données binaires et fournit une série d'interfaces d'opération. D'autres API pour exploiter les données binaires (telles que les objets File) sont basées sur l'objet Blob et hérite de ses Propriétés. et méthodes. Il existe deux façons de générer un objet Blob : l'une consiste à utiliser le constructeur Blob et l'autre consiste à utiliser la méthode slice sur un objet Blob existant (1) Constructeur Blob, accepte deux paramètres. Le premier paramètre est un

tableau

contenant les données réelles, et le deuxième paramètre est le type des données. Aucun des paramètres n'est requis. 🎜>

Ce qui suit est un exemple d'utilisation d'un objet Blob pour générer un fichier téléchargeable

Le code ci-dessus génère un lien hypertexte vous invitant à télécharger. le fichier texte hello-world.txt lorsque vous cliquez dessus. Le contenu du fichier est "Hello World" (2) La méthode slice de l'objet Blob divise les données binaires en octets et renvoie un objet New Blob
var htmlParts = [&#39;<a id="a"><b id="b">hey!<\/b><\/a>&#39;];
var myBlob = new Blob(htmlParts, {&#39;type&#39;: &#39;text\/xml&#39;});

Ce qui suit est un exemple d'utilisation de l'objet XMLHttpRequest pour télécharger

var blob = new Blob([&#39;Hello World&#39;]);var a = document.createElement(&#39;a&#39;);
a.href = window.URL.createObjectURL(blob);
a.donwload = &#39;hello-world.txt&#39;;
a.textContent = &#39;Download Hello World&#39;;

body.appendChild(a);

(3) L'objet Blob a deux attributs en lecture seule :

taille : taille des données binaires, en octets.
var newBlob = oldBlob.slice(startingByte, endindByte);

type : type MIME de données binaires, toutes en minuscules, si le type est inconnu, la valeur est vide

String
function upload(blobOrFile) {  var xhr = new XMLHttpRequest();
  xhr.open(&#39;POST&#39;, &#39;/server&#39;, true);
  xhr.onload = function(e) { ... };
  xhr.send(blobOrFile);
}

document.querySelector(&#39;input[type="file"]&#39;).addEventListener(&#39;change&#39;, function(e) {  
var blob = this.files[0];  
var BYTES_PER_CHUNK = 1024 * 1024; // 1MB chunk sizes.
  var SIZE = blob.size;  var start = 0;  
  var end = BYTES_PER_CHUNK;  while(start < SIZE) {
    upload(blob.slice(start, end));

    start = end;
    end = start + BYTES_PER_CHUNK;
  }
}, false);
.

Lorsque l'utilisateur sélectionne le fichier, le fichier peut être lu.

Les objets FileList peuvent également être obtenus par glisser-déposer.

<input type="file" id="input" onchange="console.log(this.files.length)" multiple />

Le handleFileSelect dans le code ci-dessus est la fonction de rappel de l'événement glisser-déposer

var selected_file = document.getElementById(&#39;input&#39;).files[0];
Son paramètre evt est un événement. object Ce paramètre La propriété dataTransfer.files est un objet FileList qui contient les fichiers glissés et déposés.

3. Objet File

var dropZone = document.getElementById(&#39;drop_zone&#39;);
dropZone.addEventListener(&#39;drop&#39;, handleFileSelect, false);
function handleFileSelect(evt) {
    evt.stopPropagation();
    evt.preventDefault();    
    var files = evt.dataTransfer.files; // FileList object.

    // ...}
L'objet File est membre de l'objet FileList et contient des méta-informations sur le fichier, telles que le nom du fichier, l'heure de la dernière modification, la taille du fichier. et le type de fichier. Ses valeurs d'attribut sont les suivantes :

name : nom du fichier, cet attribut est en lecture seule

size : taille du fichier, en octets, l'attribut

type en lecture seule : type MIME du fichier. Si le type ne peut pas être distingué, ce sera une chaîne vide.
  • lastModifiedDate : L'heure de la dernière modification du fichier. Cet attribut est en lecture seule.
  • 4. Objet FileReader
  • L'objet FileReader reçoit un objet File ou un objet Blob comme paramètre, qui est utilisé pour

    lire le contenu réel du fichier
  • , c'est-à-dire lire le contenu du fichier en mémoire. Pour différents types de fichiers, FileReader utilise différentes méthodes de lecture.
    • FileReader.readAsBinaryString(Blob|File) :读取结果为二进制字符串,每个字节包含一个0到255之间的整数

    • FileReader.readAsText(Blob|File, opt_encoding) :读取结果是一个文本字符串。默认情况下,文本编码格式是'UTF-8',可以通过可选的格式参数,指定其他编码格式的文本。

    • FileReader.readAsDataURL(Blob|File) : 读取结果是一个基于Base64编码的 data-uri 对象。

    • FileReader.readAsArrayBuffer(Blob|File) :读取结果是一个 ArrayBuffer 对象。

    FileReader采用异步方式读取文件,可以为一系列事件指定回调函数。

    • onabort:读取中断或调用reader.abort()方法时触发。

    • onerror:读取出错时触发。

    • onload:读取成功后触发。

    • onloadend:读取完成后触发,不管是否成功。触发顺序排在 onload 或 onerror 后面。

    • onloadstart:读取将要开始时触发。

    • onprogress:读取过程中周期性触发。

    下面的代码是如何展示文本文件的内容。

    var reader = new FileReader();
    
    reader.onload = function(e){
           console.log(e.target.result);
    }
    
    reader.readAsText(blob);

    onload事件的回调函数接受一个事件对象,该对象的target.result就是文件的内容。

    下面是一个使用readAsDataURL方法,为img元素添加src属性的例子。

    var reader = new FileReader();
    
    reader.onload = function(e) {
        document.createElement(&#39;img&#39;).src = e.target.result;
    
    };
    
    reader.readAsDataURL(f);

    下面是一个onerror事件回调函数的例子。

    var reader = new FileReader();
    reader.onerror = errorHandler;
    function errorHandler(evt) {    
    switch(evt.target.error.code) {      
    case evt.target.error.NOT_FOUND_ERR:
            alert(&#39;File Not Found!&#39;);        
            break;      
            case evt.target.error.NOT_READABLE_ERR:
            alert(&#39;File is not readable&#39;);        
            break;      
            case evt.target.error.ABORT_ERR:        
            break;      
            default:
            alert(&#39;An error occurred reading this file.&#39;);
        };
    }

    下面是一个onprogress事件回调函数的例子,主要用来显示读取进度。

    var reader = new FileReader();
    reader.onprogress = updateProgress;function updateProgress(evt) {    
    if (evt.lengthComputable) {      
    var percentLoaded = Math.round((evt.loaded / evt.totalEric Bidelman) * 100);      
          var progress = document.querySelector(&#39;.percent&#39;);      
          if (percentLoaded < 100) {
            progress.style.width = percentLoaded + &#39;%&#39;;
            progress.textContent = percentLoaded + &#39;%&#39;;
          }
        }
    }

    读取大文件的时候,可以利用Blob对象的slice方法,将大文件分成小段,逐一读取,这样可以加快处理速度。

    5、URL对象

    URL对象用于生成指向File对象或Blob对象的URL。 

    var objecturl =  window.URL.createObjectURL(blob);

    上面的代码会对二进制数据生成一个URL,类似于“blob:http%3A//test.com/666e6730-f45c-47c1-8012-ccc706f17191”。这个URL可以放置于任何通常可以放置URL的地方,比如img标签的src属性。需要注意的是,即使是同样的二进制数据,每调用一次URL.createObjectURL方法,就会得到一个不一样的URL。

    这个URL的存在时间,等同于网页的存在时间,一旦网页刷新或卸载,这个URL就失效。除此之外,也可以手动调用URL.revokeObjectURL方法,使URL失效。

    window.URL.revokeObjectURL(objectURL);

    下面是一个利用URL对象,在网页插入图片的例子。

    var img = document.createElement("img");
    
    img.src = window.URL.createObjectURL(files[0]);
    
    img.height = 60;
    
    img.onload = function(e) {
        window.URL.revokeObjectURL(this.src);
    }
    
    body.appendChild(img);var info = document.createElement("span");
    
    info.innerHTML = files[i].name + ": " + files[i].size + " bytes";
    
    body.appendChild(info);

    还有一个本机视频预览的例子。

    var video = document.getElementById(&#39;video&#39;);var obj_url = window.URL.createObjectURL(blob);
    video.src = obj_url;
    video.play()
    window.URL.revokeObjectURL(obj_url);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn