当前位置: 首页 > news >正文

JavaScript获取文件的file对象数据(不通过input)

background

最近遇到了一个图标库的需求,页面提供一些图标供用户进行选择,之前是直接让用户手动的选择电脑上的某一个图标文件进行上传的,上传图标功能用的是element组件库中的upload组件实现的,主要原理就是获取到图片的file对象,然后调用后端的upload接口,将图片的file对象数据传给后端进行上传,上传成功后接口会返回一个在线的图标地址,前端就可以通过改地址对图标进行展示,并进行设置;

problem

之前获取文件的file对象都是通过type为file的input标签手动的去选择文件,然后获取input的files属性就可以拿到对应文件的file数据了,然而这个图标库的功能就是让用户选择我们提供的图标的,而不是手动的选择自己电脑本地的文件。所以就没办法通过input标签实现;自己网上找了一些解决方案没有找到合适的,最后请教同事,同事那边提供了一个解决方案,实现原理是通过手动触发一个XHR请求,请求地址为当前图片的地址,获取请求相应的数据,并通过该数据使用new File去创建一个file对象,这个file对象就是目标文件的file;具体代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <input type="file" />
  <img src="./images/test.png" style="width: 400px">
  <script>

    let inputEl = document.querySelector('input')

    let imgEl = document.querySelector('img')

    inputEl.addEventListener('change', () => {

      let file = inputEl.files[0]

      console.log('通过input获取', file)

    })

    imgEl.addEventListener('click', clickHandle)

    function clickHandle(e) {

      getImageFileFromUrl(e.target.currentSrc).then(file => {

        // 获取图片对应的file对象
        console.log('通过XHR获取', file)

      })

    }

    // url: "http://127.0.0.1:5500/images/test.png"
    function getImageFileFromUrl(url) {
      // 截取图片名称
      let imageName = url.substring(url.lastIndexOf('/') + 1)
      // 截取图片后缀名
      let suffixName = imageName.split('.')[1]

      return new Promise((resolve, reject) => {

        let blob = null

        let xhr = new XMLHttpRequest()

        xhr.open("GET", url)

        xhr.setRequestHeader('Accept', 'image/jpeg')

        xhr.responseType = "blob"

        xhr.onload = () => {
          blob = xhr.response
          let imgFile = new File([blob], imageName, { type: `image/${suffixName}` })
          resolve(imgFile)
        }

        xhr.onerror = (e) => {
          reject(e)
        }

        xhr.send()

      })
    }

  </script>
</body>

</html>

在这里插入图片描述

end

最后就可以通过将拿到的file对象转为FormData格式的数据传给后端的upload接口,实现图片的上传了;

let formData = new FormData()
formData.append('file', file)

相关文章:

  • 数据结构与算法 -- 动态规划常见问题
  • 3.ICMP
  • 尚好房 09_权限管理
  • java面向对象(一)
  • Allegro Design Entry HDL(OrCAD Capture HDL)工具菜单详细介绍
  • Java 线程及线程池的创建方式
  • 分布式ID生成服务
  • Vue中的条件渲染v-if、v-show
  • 【Spring Boot】响应JSON实现原理
  • 基于51单片机交通信号灯仿真_东西管制+南北管制
  • 2022“杭电杯”中国大学生算法设计超级联赛(4)
  • AngelScript -- C++程序最好的脚本语言
  • 如何编写整洁的代码
  • leetcode: 122. 买卖股票的最佳时机II
  • 字符串习题总结3
  • [Vue CLI 3] 配置解析之 css.extract
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Akka系列(七):Actor持久化之Akka persistence
  • CentOS7 安装JDK
  • Docker: 容器互访的三种方式
  • golang 发送GET和POST示例
  • Java反射-动态类加载和重新加载
  • node学习系列之简单文件上传
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vultr 教程目录
  • Web设计流程优化:网页效果图设计新思路
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 百度小程序遇到的问题
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 思考 CSS 架构
  • Java总结 - String - 这篇请使劲喷我
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​secrets --- 生成管理密码的安全随机数​
  • #define 用法
  • #单片机(TB6600驱动42步进电机)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • .net 设置默认首页
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET构架之我见
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @PreAuthorize注解
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ANT] 项目中应用ANT
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [hdu4622 Reincarnation]后缀数组
  • [HUBUCTF 2022 新生赛]
  • [LeetBook]【学习日记】数组内乘积
  • [LeetCode] 178. 分数排名
  • [leetcode] Multiply Strings
  • [LeetCode]Pow(x,n)
  • [MySQL]日期和时间函数
  • [MZ test.16]P1 评测