效果

<input type="file">

我们使用 <input type="file"> 来允许用户选择文件。

<!-- `accept="image/*"` 表示只允许上传图片格式的文件。 -->
<Input id="addPic" type="file" accept="image/*" />

监听 onchange 获取已选择图片的信息,files 包含了一列 File 对象的 FileList 对象。FileList 的行为像一个数组,所以你可以检查 length 属性来获得已选择文件的数量。

每个 File 包含下列信息:

name:文件名。

lastModified:一个数字,指定文件最后一次修改的日期和时间,以 UNIX 新纪元(1970年1月1日午夜)以来的毫秒数表示。

lastModifiedDate :一个 Date 对象,表示文件最后一次修改的日期和时间。这被弃用,并且不应使用。使用 lastModified 作为替代。

size:以字节数为单位的文件大小。

type:文件的 MIME 类型。

webkitRelativePath:一个字符串,指定了相对于在目录选择器中选择的基本目录的文件路径(即,一个设置了 webkitdirectory 属性的 file 选择器)。 这是非标准的,应该谨慎使用。

document.getElement('addPic').onchange = function () {
  // 
  console.log(this.files)
}

预览

可以将 File 对象转换为 Blob 或 base 64 显示在页面上。

添加对应的 dom

<div id="preview1">
  <h2>Blob File List</h2>
</div>

<div id="preview2">
  <h2>Base64 File List</h2>
</div>

js部分

function addImg(src, id) {
  const img = document.createElement('img')
  img.src = src
  document.getElementById(id).appendChild(img)
}

function file2Blob(file) {
  const blob = window.URL.createObjectURL(file)
  addImg(blob, 'preview1')
}

function file2Base64(file) {
  const reader = new FileReader()
  reader.readAsDataURL(file)
  reader.onload = function () {
    addImg(this.result, 'preview2')
  }
}

了解 Blob、File、FileReader 等概念

  • Blob 和 File 都是数据
  • FileReader 是工具

Blob

Blob 全称 binary large object,表示二进制大对象。我们可以将它看作是只读的二进制文件。

通过构造函数,我们可以将任意内容转换为 Blob 对象

const blob = new Blob(array, options)
// array(可选):是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array 
// 或者其他类似对象的混合体。(暂时可以不用理解,就可以看作是一堆数据)
// options(可选):一个对象,用来设置Blob的一些属性。
// 主要的是一个type属性,表示Blob的类型(其他暂时也不用管)。

blob 拥有以下实例属性:

  • blob.size: 数据大小(字节)
  • blob.type: 表明该Blob对象所包含数据的MIME类型

Hello World 作为纯文本下载:

const content = 'Hello World'
const blob = new Blob([content], { type: 'text/plain' })
document.getElementById('info').innerText = `size: ${blob.size}字节; type: ${blob.type}`
const link = document.createElement('a')
link.download = 'blob.txt'
link.href = window.URL.createObjectURL(blob)
link.click()

File

File 对象也是二进制对象,基于 Blob,所以 Blob 可以使用的方法,File 也可以使用。

FileReader

Blob 是二进制对象,如果直接读取只能拿到一堆 0 1 数据,因此需要借助专门的工具来读取,这个工具就是 FileReader