input和原生js文件上传

1.input上传

input 标签主要有以下几个属性

  • accept 设置上传文件的类型,默认为空,表示可以上传所有类型文件。常见的 MIME types
  • capture 摄像头,user 前置摄像头 environment 后置摄像头
  • multiple 是否可以选多个文件 默认false
  • webkitdirectory 是否可以选择文件夹

上传图片并预览

<body>
  <input type='file'  onchange='upFile(this)'/> 
  <img style='display:none' id='img' />
</body>
<script>
  function upFile(event){
    var file=event.files[0]
    // 上传的file图片
    console.log(file)

    // 预览功能
    var fileReader = new FileReader();
    var DomImg=docudocument.getElementById('img')
    fileReader.onload = (e) => {
      // 获取选择图片的base64
      DomImg.style.display='block'
      DomImg.setAttribute('src',e.target.result)
    };
    fileReader.onerror = () => {
        DomImg.style.display='none'
    };
    fileReader.readAsDataURL(file);
  }
</script>

2.原生 JS 方式选择文件

showOpenFilePicker 选择文件。查看文档

options(可选参数)

  • multiple Boolean类型,是否可多选
  • excludeAcceptAllOption Boolean类型,是否排除允许全部类型选项,如下图
  • types Array类型,可选的文件类型数组。每个元素十个对象包含description和accept
    1. description 文件类型的描述
    2. accept 允许的文件类型对象,key为文件的MIME types,value为文件后缀名数组

通过window.showOpenFilePicker(options)获取FileSystemFileHandle 对象数组,

  • kind 文件或文件夹file directory
  • name 文件名

FileSystemFileHandle可用方法:

  • queryPermission() 查询当前句柄的当前权限状态。
  • requestPermission() 请求文件句柄的读或读写权限。
  • getFile() 返回一个Promise,解析为一个File对象,表示句柄所代表的条目在磁盘上的状态。
  • createWritable() 返回一个Promise,解析为一个新创建的FileSystemWritableFileStream对象,该对象可用于写入文件。
async function uploadFile(){
    var options = {
        types: [{
            description: '只允许上传图片文件',
            accept: {
                // "text/plain": [".txt"],
                // 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': ['.xlsx'],
                // 'application/vnd.ms-excel': ['.xls'],
                'image/*': ['.png', '.gif', '.jpeg', '.jpg', '.webp']
            }
        }],
        multiple: true, // 是否允许上传多个文件,
        excludeAcceptAllOption: true // 是否排除允许全部类型选项
    };
    try {
      // 打开图片选择
      const fileHandleList = await window.showOpenFilePicker(options);
      // 通过getFile()获取file
      const file = await fileHandleList[0].getFile();

      // 预览功能一
      var fileReader = new FileReader();
      fileReader.onload = (e) => {
        // 获取选择图片的base64
        console.log(e.target.result)
      };
      fileReader.onerror = () => {

      };
      fileReader.readAsDataURL(file);

      // 预览功能二
      // const buffer = await file.arrayBuffer();
      // const newImg = new Image();
      // const url = URL.createObjectURL(new Blob([buffer]));
      // newImg.onload = function() {
      //   console.log(url,'预览的图片地址')
      //   URL.revokeObjectURL(url);
      // };
      // newImg.src = url;
      
    } catch (error) {
      alert('该浏览器不支持showOpenFilePicker方法,请切换浏览器')
    }
};

showDirectoryPicker 选择文件夹。查看文档

async function getDir() {
  const dirHandle = await window.showDirectoryPicker();//打开选择文件
  const FileHandle  = await dirHandle.getFileHandle('3.jpg');//找到3.jpg文件
  console.log(dirHandle,FileHandle)
}

showSaveFilePicker 保存文件 查看文档

const options = { 
    suggestedName: 'img',
     types: [
        {
          description: "PNG file",
          accept: {
            "image/png": [".png"],
          },
        },
        {
          description: "Jpeg file",
          accept: {
            "image/jpeg": [".jpeg"],
          },
         },
    ],
    //txt 的写入保存
    // types: [{
    //     description: '只允许保存txt格式文件',
    //     accept: {
    //         "text/plain": [".txt"],
    //     }
    // }]
}
const saveFile = async () => {
    const FileSystemFileHandle = await window.showSaveFilePicker(options);
    const w = await FileSystemFileHandle.createWritable();
    
    const blob = new Blob([])//文件的Blob
    await writable.write(blob);
    // await w.write('showSaveFilePicker');//存文本的写入
    await w.close();
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值