js截图并下载图片和上传照片

安装html2canvas

npm i html2canvas

  <div id="map"></div>
  <button onclick="btn()">截图</button>
	
    function btn(){
      const canvas = document.createElement("canvas");
      let canvasBox = document.getElementById('map');
      console.log(canvasBox);
      // 获取父级的宽高
      const width = parseInt(window.getComputedStyle(canvasBox).width);
      const height = parseInt(window.getComputedStyle(canvasBox).height);
      // 宽高 * 2 并放大 2 倍 是为了防止图片模糊
      canvas.width = width * 2;
      canvas.height = height * 2;
      canvas.style.width = width + "px";
      canvas.style.height = height + "px";
      const context = canvas.getContext("2d");
      context.scale(2, 2);
      html2canvas(canvasBox, { 
        allowTaint: true,
        useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题 
      }).then((canvas) => {
        // debugger;
        const capture = canvas.toDataURL("image/png");
        console.log(saveInfo);
        //下载浏览器弹出下载信息的属性
        const saveInfo = {
          //导出文件格式自己定义,我这里用的是时间作为文件名
          download: `mapbox.png`,
          href: capture,
        };
        downloadFile(saveInfo)

        // base64转二进制数据流
        let str = base64toFile(capture, '图片名称')
        let formData = new FormData();
        formData.append("file", str);
        // 调接口上传
      });
    }

	/**
	 * 下载
	 */
    function downloadFile(saveInfo){
      const element = document.createElement("a");
      element.style.display = "none";
      for (const key in saveInfo) {
        element.setAttribute(key, saveInfo[key]);
      }
      document.body.appendChild(element);
      element.click();
      setTimeout(() => {
        document.body.removeChild(element);
      }, 300);
    }

    /**
     *  base64转二进制数据流
     *  @param  {String} data:base64图片格式字符串
     *  @param  {String} filename:文件名称
     */
    base64toFile(data, fileName) {
      const dataArr = data.split(",");
      const byteString = atob(dataArr[1]);
      const options = {
        type: "image/png",
        endings: "native",
      };
      const u8Arr = new Uint8Array(byteString.length);
      for (let i = 0; i < byteString.length; i++) {
        u8Arr[i] = byteString.charCodeAt(i);
      }
      return new File([u8Arr], fileName + ".png", options); //返回文件流
    },
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端照片上传处理: 1. 创建一个表单,包括一个上传文件的 input 标签和一个提交按钮。 2. 监听 input 标签的 change 事件,获取用户选择的文件。 3. 使用 FileReader API 将文件转换成 base64 编码的字符串。 4. 将 base64 编码的字符串作为参数发送给后端接口。 示例代码: ```html <form> <input type="file" id="file-input"> <button type="submit" onclick="handleUpload()">上传</button> </form> ``` ```javascript function handleUpload() { const fileInput = document.getElementById('file-input') const file = fileInput.files[0] const reader = new FileReader() reader.readAsDataURL(file) reader.onload = function() { const base64String = reader.result.split(',')[1] // 发送 base64String 到后端接口 } } ``` 后端照片上传处理: 1. 接收前端发送过来的 base64 编码的字符串。 2. 使用 base64 解码将字符串转换成二进制数据。 3. 使用文件系统模块(如 Node.js 的 fs 模块)将二进制数据写入磁盘中。 示例代码(使用 Node.js 的 fs 模块): ```javascript const fs = require('fs') function handleUpload(req, res) { const base64String = req.body.base64String const buffer = Buffer.from(base64String, 'base64') fs.writeFile('path/to/save/image.jpg', buffer, function(err) { if (err) { res.status(500).send('上传失败') } else { res.send('上传成功') } }) } ``` 照片下载: 1. 前端发送请求到后端接口,请求需要下载图片的地址或者 ID。 2. 后端根据地址或者 ID 找到对应的图片文件,读取文件内容。 3. 将文件内容作为响应体,设置 Content-Type 为图片类型。 示例代码(使用 Node.js 的 fs 模块): ```javascript const fs = require('fs') function handleDownload(req, res) { const imagePath = 'path/to/image.jpg' fs.readFile(imagePath, function(err, data) { if (err) { res.status(404).send('图片不存在') } else { res.setHeader('Content-Type', 'image/jpeg') res.send(data) } }) } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值