Skip to content

File相关

根据规范文档描述,File继承自Blob。所以File既有Blob特性,又有自身特性(文件的名称、大小、类型和最后修改日期等)。

c++
[Exposed=(Window,Worker), Serializable]
interface File : Blob {
  constructor(sequence<BlobPart> fileBits,
              USVString fileName,
              optional FilePropertyBag options = {});
  readonly attribute DOMString name;
  readonly attribute long long lastModified;
};

dictionary FilePropertyBag : BlobPropertyBag {
  long long lastModified;
};

File对象

File对象可以通过两种方式创建,第一种是通过File构造器:

javascript
new File(fileBits, fileName, options);

fileBits为 blobParts数组,blobParts可以是Blob对象,字符串和BufferSource,和Blob参数一致。

第二种方式是 input标签获得的文件列表:

javascript
const fileInput = document.querySelector('input[type="file"]');
const files = fileInput.files;

或者从拖放操作的 DataTransfer 对象中获取

FileReader

FileReader对象的唯一目的是用于读取File、Blob对象的内容。它提供了多种方法,像readAsArrayBuffer、readAsBinaryString、readAsDataURL和readAsText。 FileReader对象提供了以下方法来读取文件:

  • readAsArrayBuffer(obj): 将文件读取为ArrayBuffer对象。
  • readAsBinaryString(obj): 将文件读取为二进制字符串,此方法已弃用,推荐使用readAsArrayBuffer。
  • readAsDataURL(obj): 将文件读取为DataURL字符串(base64)。
  • readAsText(obj, encoding): 将文件读取为文本字符串,encoding参数指定编码方式,默认为UTF-8。

FileReader对象提供了以下事件来监听读取状态:

  • onloadstart: 读取开始时触发。
  • onprogress: 读取过程中触发, readyState为LOADing。
  • onabort: 读取被中止时触发。
  • onerror: 读取发生错误时触发。
  • onload: 读取成功完成时触发, readyState为LOADing。
  • onloadend: 读取完成时触发, readyState为DONE。

实例

javascript
const fileInput = document.querySelector('input[type="file"]');
const files = fileInput.files;

files.forEach(file => {
  const reader = new FileReader();
  reader.onload = function(event) {
    const content = event.target.result;
    console.log(content);
  };
  reader.readAsText(file);
});

因为FileReader对象的readyState属性可以用来判断当前读取状态,它有以下值:

  • EMPTY: 0,初始状态。
  • LOADING: 1,正在读取。
  • DONE: 2,读取完成。

所以,onprogress事件中可以使用readyState属性来判断当前读取状态。

另外,FileReader继承了EventTarget接口,因此可以使用addEventListener方法来监听事件。

友情提示:Element 及其子项、document 和 window, XMLHttpRequest、AudioNode 和 AudioContext都继承了EventTarget,所以都允许使用addEventListener方法监听

c++
[Exposed=(Window,Worker)]
interface FileReader: EventTarget {
  constructor();
  // async read methods
  undefined readAsArrayBuffer(Blob blob);
  undefined readAsBinaryString(Blob blob);
  undefined readAsText(Blob blob, optional DOMString encoding);
  undefined readAsDataURL(Blob blob);

  undefined abort();

  // states
  const unsigned short EMPTY = 0;
  const unsigned short LOADING = 1;
  const unsigned short DONE = 2;

  readonly attribute unsigned short readyState;

  // File or Blob data
  readonly attribute (DOMString or ArrayBuffer)? result;

  readonly attribute DOMException? error;

  // event handler content attributes
  attribute EventHandler onloadstart;
  attribute EventHandler onprogress;
  attribute EventHandler onload;
  attribute EventHandler onabort;
  attribute EventHandler onerror;
  attribute EventHandler onloadend;
};

注册事件监听实例

javascript
const fileInput = document.querySelector('input[type="file"]');
const files = fileInput.files;

files.forEach(file => {
  const reader = new FileReader();
  reader.addEventListener('loadstart', () => {
    console.log('开始读取文件');
  });
  reader.addEventListener('progress', event => {
    console.log(`读取进度:${event.loaded}/${event.total}`);
  });
  reader.addEventListener('load', () => {
    console.log('文件读取完成');
  });
  reader.addEventListener('abort', () => {
    console.log('文件读取被取消');
  });
  reader.addEventListener('error', () => {
    console.log('文件读取出错');
  });
  reader.addEventListener('loadend', () => {
    console.log('文件读取结束');
  });
  reader.readAsText(file);
});

规范

FileReader

陕ICP备15010740号