Vant上傳圖片壓縮

?<van-uploader?v-model="fileList"?multiple?:after-read="afterRead"?max-count="1">

? ? ? ? ? ? ? ?<button?type="button"><span>+</span>?轉(zhuǎn)賬截圖</button>

??????????????</van-uploader>



afterRead(file) {

? ? ? if (!file.file) {

? ? ? ? return;

? ? ? }

? ? ? // 此時(shí)可以自行將文件上傳至服務(wù)器

? ? ? file.status = "uploading";

? ? ? file.message = "上傳中...";

? ? ? let maxSize = 1 * 1024 * 1024; //自己定義的文件大小抗蠢,超過多少M(fèi)就開始?jí)嚎s(現(xiàn)在是1M)

? ? ? let fileObj = file.file; // 當(dāng)前的圖片

? ? ? if (fileObj.size > maxSize) {

? ? ? ? this.imgcompress(fileObj, file);

? ? ? } else {

? ? ? ? const formData = new FormData();

? ? ? ? formData.append("file[]", file.file); //此處的文件上傳是formData格式

? ? ? ? formData.append("private", 0);

? ? ? ? let dirName = "voucher_img";

? ? ? ? formData.append("dir", dirName);

? ? ? ? console.log(file.file);

? ? ? ? upload(formData)

? ? ? ? ? .then((res) => {

? ? ? ? ? ? this.rechargeFile = res.data.data;

? ? ? ? ? ? file.status = "";

? ? ? ? ? ? file.message = "";

? ? ? ? ? })

? ? ? ? ? .catch((err) => {

? ? ? ? ? ? file.status = "failed";

? ? ? ? ? ? file.message = "上傳失敗";

? ? ? ? ? });

? ? ? }

? ? },

? ? imgcompress(file, files) {

? ? ? const img = document.createElement("img");

? ? ? const reader = new FileReader(); // 讀取文件資源實(shí)例

? ? ? reader.readAsDataURL(file); //讀取圖片資源

? ? ? reader.onload = (e) => {

? ? ? ? //讀取成功

? ? ? ? img.src = e.target.result;

? ? ? ? const { width: originWidth, height: originHeight } = img; //上傳的圖片的寬高

? ? ? ? const maxWidth = 1000, //設(shè)置一個(gè)canvas 的最大寬高

? ? ? ? ? maxHight = 1000;

? ? ? ? if (originWidth > maxWidth || originHeight > maxHight) {

? ? ? ? ? //計(jì)算出圖片的縮放比例

? ? ? ? ? if (originWidth > originHeight) {

? ? ? ? ? ? //寬 大于 高

? ? ? ? ? ? const Proportion = Math.ceil(originWidth / maxWidth);

? ? ? ? ? ? let targetWidht = parseInt(originWidth / Proportion); //目標(biāo)的寬度

? ? ? ? ? ? let targetHeight = parseInt(originHeight / Proportion); //目標(biāo)的高度

? ? ? ? ? ? this.createCanvasCompress(targetWidht, targetHeight, img, files);

? ? ? ? ? } else {

? ? ? ? ? ? const Proportion = Math.ceil(originHeight / maxHight); //高大于寬

? ? ? ? ? ? let targetWidht = parseInt(originWidth / Proportion); //目標(biāo)的寬度

? ? ? ? ? ? let targetHeight = parseInt(originHeight / Proportion); //目標(biāo)的高度

? ? ? ? ? ? let bold = this.createCanvasCompress(

? ? ? ? ? ? ? targetWidht,

? ? ? ? ? ? ? targetHeight,

? ? ? ? ? ? ? img,

? ? ? ? ? ? ? files

? ? ? ? ? ? );

? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? let quality = 0.8;

? ? ? ? ? this.createCanvasCompress(

? ? ? ? ? ? originWidth,

? ? ? ? ? ? originHeight,

? ? ? ? ? ? img,

? ? ? ? ? ? files,

? ? ? ? ? ? quality

? ? ? ? ? );

? ? ? ? }

? ? ? };

? ? },

? ? createCanvasCompress(targetWidth, targetHeight, img, files, quality) {

? ? ? let that = this;

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

? ? ? ? const canvas = document.createElement("canvas");

? ? ? ? const context = canvas.getContext("2d");

? ? ? ? // 設(shè)置寬高度為等同于要壓縮圖片的尺寸

? ? ? ? canvas.width = targetWidth;

? ? ? ? canvas.height = targetHeight;

? ? ? ? context.clearRect(0, 0, targetWidth, targetHeight);

? ? ? ? //將img繪制到畫布上

? ? ? ? console.log(targetWidth, targetHeight);

? ? ? ? context.drawImage(img, 0, 0, targetWidth, targetHeight);

? ? ? ? files.content = canvas.toDataURL(files.file.type, 0.8); // 0.92為默認(rèn)壓縮質(zhì)量

? ? ? ? const newFile = this.dataURLtoFile(files.content, files.file.name);

? ? ? ? const formData = new FormData();

? ? ? ? formData.append("file[]", newFile);

? ? ? ? formData.append("private", 0);

? ? ? ? let dirName = "voucher_img";

? ? ? ? formData.append("dir", dirName);

? ? ? ? console.log(newFile);

? ? ? ? upload(formData)

? ? ? ? ? .then((res) => {

? ? ? ? ? ? this.rechargeFile = res.data.data;

? ? ? ? ? ? files.status = "";

? ? ? ? ? ? files.message = "";

? ? ? ? ? })

? ? ? ? ? .catch((err) => {

? ? ? ? ? ? files.status = "failed";

? ? ? ? ? ? files.message = "上傳失敗";

? ? ? ? ? });

? ? ? });

? ? },

JS部分

afterRead(file)?{

??????if?(!file.file)?{

????????return;

??????}

??????//?此時(shí)可以自行將文件上傳至服務(wù)器

??????file.status?=?"uploading";

??????file.message?=?"上傳中...";

??????let?maxSize?=?1?*?1024?*?1024;?//自己定義的文件大小,超過多少M(fèi)就開始?jí)嚎s(現(xiàn)在是1M)

??????let?fileObj?=?file.file;?//?當(dāng)前的圖片

??????if?(fileObj.size?>?maxSize)?{

????????this.imgcompress(fileObj,?file);

??????}?else?{

????????const?formData?=?new?FormData();

????????formData.append("file[]",?file.file);?//此處的文件上傳是formData格式

????????formData.append("private",?0);

????????let?dirName?=?"voucher_img";

????????formData.append("dir",?dirName);

????????console.log(file.file);

????????upload(formData)

??????????.then((res)?=>?{

????????????this.rechargeFile?=?res.data.data;

????????????file.status?=?"";

????????????file.message?=?"";

??????????})

??????????.catch((err)?=>?{

????????????file.status?=?"failed";

????????????file.message?=?"上傳失敗";

??????????});

??????}

????},

????imgcompress(file,?files)?{

??????const?img?=?document.createElement("img");

??????const?reader?=?new?FileReader();?//?讀取文件資源實(shí)例

??????reader.readAsDataURL(file);?//讀取圖片資源

??????reader.onload?=?(e)?=>?{

????????//讀取成功

????????img.src?=?e.target.result;

????????const?{?width:?originWidth,?height:?originHeight?}?=?img;?//上傳的圖片的寬高

????????const?maxWidth?=?1000,?//設(shè)置一個(gè)canvas?的最大寬高

??????????maxHight?=?1000;

????????if?(originWidth?>?maxWidth?||?originHeight?>?maxHight)?{

??????????//計(jì)算出圖片的縮放比例

??????????if?(originWidth?>?originHeight)?{

????????????//寬?大于?高

????????????const?Proportion?=?Math.ceil(originWidth?/?maxWidth);

????????????let?targetWidht?=?parseInt(originWidth?/?Proportion);?//目標(biāo)的寬度

????????????let?targetHeight?=?parseInt(originHeight?/?Proportion);?//目標(biāo)的高度

????????????this.createCanvasCompress(targetWidht,?targetHeight,?img,?files);

??????????}?else?{

????????????const?Proportion?=?Math.ceil(originHeight?/?maxHight);?//高大于寬

????????????let?targetWidht?=?parseInt(originWidth?/?Proportion);?//目標(biāo)的寬度

????????????let?targetHeight?=?parseInt(originHeight?/?Proportion);?//目標(biāo)的高度

????????????let?bold?=?this.createCanvasCompress(

??????????????targetWidht,

??????????????targetHeight,

??????????????img,

??????????????files

????????????);

??????????}

????????}?else?{

??????????let?quality?=?0.8;

??????????this.createCanvasCompress(

????????????originWidth,

????????????originHeight,

????????????img,

????????????files,

????????????quality

??????????);

????????}

??????};

????},

????createCanvasCompress(targetWidth,?targetHeight,?img,?files,?quality)?{

??????let?that?=?this;

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

????????const?canvas?=?document.createElement("canvas");

????????const?context?=?canvas.getContext("2d");

????????//?設(shè)置寬高度為等同于要壓縮圖片的尺寸

????????canvas.width?=?targetWidth;

????????canvas.height?=?targetHeight;

????????context.clearRect(0,?0,?targetWidth,?targetHeight);

????????//將img繪制到畫布上

????????console.log(targetWidth,?targetHeight);

????????context.drawImage(img,?0,?0,?targetWidth,?targetHeight);

????????files.content?=?canvas.toDataURL(files.file.type,?0.8);?//?0.92為默認(rèn)壓縮質(zhì)量

????????const?newFile?=?this.dataURLtoFile(files.content,?files.file.name);

????????const?formData?=?new?FormData();

????????formData.append("file[]",?newFile);

????????formData.append("private",?0);

????????let?dirName?=?"voucher_img";

????????formData.append("dir",?dirName);

????????console.log(newFile);

????????upload(formData)

??????????.then((res)?=>?{

????????????this.rechargeFile?=?res.data.data;

????????????files.status?=?"";

????????????files.message?=?"";

??????????})

??????????.catch((err)?=>?{

????????????files.status?=?"failed";

????????????files.message?=?"上傳失敗";

??????????});

??????});

????},

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末思劳,一起剝皮案震驚了整個(gè)濱河市迅矛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潜叛,老刑警劉巖秽褒,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異威兜,居然都是意外死亡销斟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門椒舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚂踊,“玉大人,你說我怎么就攤上這事笔宿°彩疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵措伐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我军俊,道長(zhǎng)侥加,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任粪躬,我火速辦了婚禮担败,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘镰官。我一直安慰自己提前,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布泳唠。 她就那樣靜靜地躺著狈网,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拓哺,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天勇垛,我揣著相機(jī)與錄音,去河邊找鬼士鸥。 笑死闲孤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烤礁。 我是一名探鬼主播讼积,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼脚仔!你這毒婦竟也來了勤众?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤玻侥,失蹤者是張志新(化名)和其女友劉穎决摧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凑兰,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掌桩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姑食。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片波岛。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖音半,靈堂內(nèi)的尸體忽然破棺而出则拷,到底是詐尸還是另有隱情,我是刑警寧澤曹鸠,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布煌茬,位于F島的核電站,受9級(jí)特大地震影響彻桃,放射性物質(zhì)發(fā)生泄漏坛善。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一邻眷、第九天 我趴在偏房一處隱蔽的房頂上張望眠屎。 院中可真熱鬧,春花似錦肆饶、人聲如沸改衩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葫督。三九已至竭鞍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間候衍,已是汗流浹背笼蛛。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛉鹿,地道東北人滨砍。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妖异,于是被迫代替她去往敵國和親惋戏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355