vue + element 上传图片 常用方法

base64 转译为 文件流

    base64toFile(dataurl, filename = "file") {    // dataurl  为 base64字符串。 filename 为文件名
      let arr = dataurl.split(",");
      let mime = arr[0].match(/:(.*?);/)[1];
      let suffix = mime.split("/")[1];
      let bstr = atob(arr[1]);
      let n = bstr.length;
      let u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], `${filename}.${suffix}`, {
        type: mime
      });
    },

文件流转。base64 (以下方法 自己搭建的ftp流媒体服务器 会有跨域操作 一般情况下 前端解决不了。需要后端进行转译(添加转译接口))

   function convertImgToBase64(url, callback) {
        let canvas = document.createElement('canvas'),
        ctx = canvas.getContext('2d'),
        img = new Image();
        img.crossOrigin = 'anonymous';//解决Canvas.toDataURL 图片跨域问题
        img.onload = () => {
          canvas.height = img.height;
          canvas.width = img.width;
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
          let ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase(); // 获取到图片的格式
          let dataURL = canvas.toDataURL("image/" + ext); // 得到base64 编码的 dataURL
          callback && callback(dataURL);
          canvas = null;
        };
        img.src = url;
      }
 
var  baseUrl = ''
convertImgToBase64(this.options.logo, (baseUrl) => {
    baseUrl = baseUrl
})

手动上传方式
页面引用

import axios from "axios";
//  以下为方法调用
uploadImg: function(files) {
      var formdata = new FormData();
      formdata.append("file", files);
      axios({
        method: "POST",
        url:   url,       // 上传地址
        headers: { Authorization: "Bearer " + getToken() }, // 请求头配置
        data: formdata    // 携带参数
      })
        .then(response => {
          if (response.data.code == "200") {
        
             // 成功处理
          } else {
             // 失败处理
          }
 
        })
        .catch(res => {
          // 接口异常处理

        });
    }

压缩图片方法

// 安装压缩软件 lrz
npm i lrz -save
// 页面引用
import lrz from "lrz";
// 使用
//  选中文件
    changeImgFile: function(file, fileList) {
      let _this = this;
      const isJPG =
        file.raw.type === "image/jpg" ||
        file.raw.type === "image/jpeg" ||
        file.raw.type === "image/gif" ||
        file.raw.type === "image/png" ||
        file.raw.type === "image/bmp";
      if (!isJPG) {
        this.$message.error("上传图片必须是JPG/JPEG/GIF/PNG/BMP 格式!");
        return;
      }
      console.log("压缩前大小:" + file.raw.size / 1024 / 1024);
      lrz(file.raw)
        .then(function(rst) {
          console.log("压缩后大小:" + rst.file.size / 1024 / 1024);
        })
        .catch(function(err) {
          this.$message.error("图片压缩失败!");
          // 处理失败会执行
        })
        .always(function() {
          // 不管是成功失败,都会执行
        });
    },

实现图片可编辑

// 安装插件
npm i tui-image-editor
// 页面引用   
import "tui-image-editor/dist/tui-image-editor.css";
import "tui-color-picker/dist/tui-color-picker.css";
import ImageEditor from "tui-image-editor";

//页面使用  
// html
<div id="tui-image-editor"></div>
// js  使用时若有图片跨域问题。可转为base 64 使用。 
data() {
    return {
      instance: null,
      locale_zh: {
        ZoomIn: "放大",

        ZoomOut: "缩小",

        Hand: "手掌",

        History: "历史",

        Resize: "调整宽高",

        Crop: "裁剪",

        DeleteAll: "全部删除",

        Delete: "删除",

        Undo: "撤销",

        Redo: "反撤销",

        Reset: "重置",

        Flip: "镜像",

        Rotate: "旋转",

        Draw: "画",

        Shape: "形状标注",

        Icon: "图标标注",

        Text: "文字标注",

        Mask: "遮罩",

        Filter: "滤镜",

        Bold: "加粗",

        Italic: "斜体",

        Underline: "下划线",

        Left: "左对齐",

        Center: "居中",

        Right: "右对齐",

        Color: "颜色",

        "Text size": "字体大小",

        Custom: "自定义",

        Square: "正方形",

        Apply: "应用",

        Cancel: "取消",

        "Flip X": "X 轴",

        "Flip Y": "Y 轴",

        Range: "区间",

        Stroke: "描边",

        Fill: "填充",

        Circle: "圆",

        Triangle: "三角",

        Rectangle: "矩形",

        Free: "曲线",

        Straight: "直线",

        Arrow: "箭头",

        "Arrow-2": "箭头2",

        "Arrow-3": "箭头3",

        "Star-1": "星星1",

        "Star-2": "星星2",

        Polygon: "多边形",

        Location: "定位",

        Heart: "心形",

        Bubble: "气泡",
        "Custom icon": "自定义图标",
        "Load Mask Image": "加载蒙层图片",
        Grayscale: "灰度",
        Blur: "模糊",
        Sharpen: "锐化",
        Emboss: "浮雕",
        "Remove White": "除去白色",
        Distance: "距离",
        Brightness: "亮度",
        Noise: "噪音",
        "Color Filter": "彩色滤镜",
        Sepia: "棕色",
        Sepia2: "棕色2",
        Invert: "负片",
        Pixelate: "像素化",
        Threshold: "阈值",
        Tint: "色调",
        Multiply: "正片叠底",
        Blend: "混合色",
        Width: "宽度",
        Height: "高度",
        "Lock Aspect Ratio": "锁定宽高比例"
      },
      customTheme: {
        "common.bi.image": "", // 左上角logo图片

        "common.bisize.width": "0px",

        "common.bisize.height": "0px",

        "common.backgroundImage": "none",

        "common.backgroundColor": "#f3f4f6",

        "common.border": "1px solid #333",

        // header

        "header.backgroundImage": "none",

        "header.backgroundColor": "#f3f4f6",

        "header.border": "0px",

        // load button

        "loadButton.backgroundColor": "#fff",

        "loadButton.border": "1px solid #ddd",

        "loadButton.color": "#222",

        "loadButton.fontFamily": "NotoSans, sans-serif",

        "loadButton.fontSize": "12px",

        "loadButton.display": "none", // 隐藏

        // download button

        "downloadButton.backgroundColor": "#fdba3b",

        "downloadButton.border": "1px solid #fdba3b",

        "downloadButton.color": "#fff",

        "downloadButton.fontFamily": "NotoSans, sans-serif",

        "downloadButton.fontSize": "12px",

        "downloadButton.display": "none", // 隐藏

        // icons default

        "menu.normalIcon.color": "#8a8a8a",

        "menu.activeIcon.color": "#555555",

        "menu.disabledIcon.color": "#ccc",

        "menu.hoverIcon.color": "#e9e9e9",

        "submenu.normalIcon.color": "#8a8a8a",

        "submenu.activeIcon.color": "#e9e9e9",

        "menu.iconSize.width": "24px",

        "menu.iconSize.height": "24px",

        "submenu.iconSize.width": "32px",

        "submenu.iconSize.height": "32px",

        // submenu primary color

        "submenu.backgroundColor": "#1e1e1e",

        "submenu.partition.color": "#858585",

        // submenu labels

        "submenu.normalLabel.color": "#858585",

        "submenu.normalLabel.fontWeight": "lighter",

        "submenu.activeLabel.color": "#fff",

        "submenu.activeLabel.fontWeight": "lighter",

        // checkbox style

        "checkbox.border": "1px solid #ccc",

        "checkbox.backgroundColor": "#fff",

        // rango style

        "range.pointer.color": "#fff",

        "range.bar.color": "#666",

        "range.subbar.color": "#d1d1d1",

        "range.disabledPointer.color": "#414141",

        "range.disabledBar.color": "#282828",

        "range.disabledSubbar.color": "#414141",

        "range.value.color": "#fff",

        "range.value.fontWeight": "lighter",

        "range.value.fontSize": "11px",

        "range.value.border": "1px solid #353535",

        "range.value.backgroundColor": "#151515",

        "range.title.color": "#fff",

        "range.title.fontWeight": "lighter",

        // colorpicker style

        "colorpicker.button.border": "1px solid #1e1e1e",

        "colorpicker.title.color": "#fff"
      }
    };
  },
methods: {
    init(imgUrl) {   // imgUrl 图片路径。  http地址类。或者。base64
      this.instance = new ImageEditor(
        document.querySelector("#tui-image-editor"),
        {
          includeUI: {
            loadImage: {
              path: imgUrl,
              name: "image"
            },
            initMenu: "draw", // 默认打开的菜单项
            menuBarPosition: "bottom", // 菜单所在的位置
            locale: this.locale_zh,
            theme: this.customTheme
          },
          cssMaxWidth: 1000, // canvas 最大宽度
          cssMaxHeight: 600 // canvas 最大高度
        }
      );
      document.getElementsByClassName("tui-image-editor-main")[0].style.top =
        "45px"; // 图片距顶部工具栏的距离
      document.getElementsByClassName(
        "tie-btn-reset tui-image-editor-item help"
      )[0].style.display = "none"; // 隐藏顶部重置按钮
      // canvas区域不遮挡图片 只显示编辑区
      document.getElementsByClassName(
        "tui-image-editor-main"
      )[0].style.top = 50;
      // canvas区域底部如果不加上这个,点击底部的功能按键,会遮挡图片,造成看不全,加上之后就可以了
      document.getElementsByClassName("lower-canvas")[0].style.paddingBottom =
        "120px";
 // 防止 涂鸦后偏移问题
      document.getElementsByClassName("upper-canvas ")[0].style.paddingBottom =
        "120px";
      // 隐藏删除按钮 留下全部删除就够了
      document.getElementsByClassName(
        "tie-btn-delete tui-image-editor-item help"
      )[0].style.display = "none";
    },
    handleCanvas2Img() {  // 自己自定义按钮位置
      // 调用组件官方方法,获取整个编辑后图片的base64数据
      const base64String = this.instance.toDataURL();

    },
  },


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容