vue + element 上傳圖片 常用方法

base64 轉(zhuǎn)譯為 文件流

    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
      });
    },

文件流轉(zhuǎn)赎败。base64 (以下方法 自己搭建的ftp流媒體服務(wù)器 會有跨域操作 一般情況下 前端解決不了卓箫。需要后端進行轉(zhuǎn)譯(添加轉(zhuǎn)譯接口))

   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";
//  以下為方法調(diào)用
uploadImg: function(files) {
      var formdata = new FormData();
      formdata.append("file", files);
      axios({
        method: "POST",
        url:   url,       // 上傳地址
        headers: { Authorization: "Bearer " + getToken() }, // 請求頭配置
        data: formdata    // 攜帶參數(shù)
      })
        .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("圖片壓縮失敗!");
          // 處理失敗會執(zhí)行
        })
        .always(function() {
          // 不管是成功失敗罩扇,都會執(zhí)行
        });
    },

實現(xiàn)圖片可編輯

// 安裝插件
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  使用時若有圖片跨域問題婆芦。可轉(zhuǎn)為base 64 使用喂饥。 
data() {
    return {
      instance: null,
      locale_zh: {
        ZoomIn: "放大",

        ZoomOut: "縮小",

        Hand: "手掌",

        History: "歷史",

        Resize: "調(diào)整寬高",

        Crop: "裁剪",

        DeleteAll: "全部刪除",

        Delete: "刪除",

        Undo: "撤銷",

        Redo: "反撤銷",

        Reset: "重置",

        Flip: "鏡像",

        Rotate: "旋轉(zhuǎn)",

        Draw: "畫",

        Shape: "形狀標注",

        Icon: "圖標標注",

        Text: "文字標注",

        Mask: "遮罩",

        Filter: "濾鏡",

        Bold: "加粗",

        Italic: "斜體",

        Underline: "下劃線",

        Left: "左對齊",

        Center: "居中",

        Right: "右對齊",

        Color: "顏色",

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

        Custom: "自定義",

        Square: "正方形",

        Apply: "應(yīng)用",

        Cancel: "取消",

        "Flip X": "X 軸",

        "Flip Y": "Y 軸",

        Range: "區(qū)間",

        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: "色調(diào)",
        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區(qū)域不遮擋圖片 只顯示編輯區(qū)
      document.getElementsByClassName(
        "tui-image-editor-main"
      )[0].style.top = 50;
      // canvas區(qū)域底部如果不加上這個,點擊底部的功能按鍵集侯,會遮擋圖片被啼,造成看不全,加上之后就可以了
      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() {  // 自己自定義按鈕位置
      // 調(diào)用組件官方方法棠枉,獲取整個編輯后圖片的base64數(shù)據(jù)
      const base64String = this.instance.toDataURL();

    },
  },


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浓体,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辈讶,更是在濱河造成了極大的恐慌命浴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異生闲,居然都是意外死亡媳溺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門碍讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悬蔽,“玉大人,你說我怎么就攤上這事捉兴⌒В” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵倍啥,是天一觀的道長禾乘。 經(jīng)常有香客問我,道長虽缕,這世上最難降的妖魔是什么始藕? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮氮趋,結(jié)果婚禮上伍派,老公的妹妹穿的比我還像新娘。我一直安慰自己凭峡,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布决记。 她就那樣靜靜地躺著摧冀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪系宫。 梳的紋絲不亂的頭發(fā)上索昂,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音扩借,去河邊找鬼椒惨。 笑死,一個胖子當著我的面吹牛潮罪,可吹牛的內(nèi)容都是我干的康谆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嫉到,長吁一口氣:“原來是場噩夢啊……” “哼沃暗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起何恶,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤孽锥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惜辑,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡唬涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盛撑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碎节。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撵彻,靈堂內(nèi)的尸體忽然破棺而出钓株,到底是詐尸還是另有隱情,我是刑警寧澤陌僵,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布轴合,位于F島的核電站,受9級特大地震影響碗短,放射性物質(zhì)發(fā)生泄漏受葛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一偎谁、第九天 我趴在偏房一處隱蔽的房頂上張望总滩。 院中可真熱鬧,春花似錦巡雨、人聲如沸闰渔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冈涧。三九已至,卻和暖如春正蛙,著一層夾襖步出監(jiān)牢的瞬間督弓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工乒验, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愚隧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓锻全,卻偏偏與公主長得像狂塘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鳄厌,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容