最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用js在layui中實現(xiàn)上傳圖片壓縮

 更新時間:2019年06月18日 10:06:45   投稿:newname  
這篇文章主要介紹了使用js在layui中實現(xiàn)上傳圖片壓縮,layui 是一款采用自身模塊規(guī)范編寫的前端 UI 框架,js上傳圖片壓縮百度有很多方法,,需要的朋友可以參考下

一、關于js上傳圖片壓縮的方法,百度有很多種方法,這里我參考修改了一下

function photoCompress(file, w, objDiv) {
var ready = new FileReader();
/*開始讀取指定的Blob對象或File對象中的內(nèi)容. 當讀取操作完成時,readyState屬性的值會成為DONE,如果設置了onloadend事件處理程序,則調(diào)用之.同時,result屬性中將包含一個data: URL格式的字符串以表示所讀取文件的內(nèi)容.*/
ready.readAsDataURL(file);
ready.onload = function() {
var re = this.result;
canvasDataURL(re, w, objDiv);
}
};
function canvasDataURL(path, obj, callback) {
var img = new Image();
img.src = path;
img.onload = function() {
var that = this;
// 默認按比例壓縮
var w = that.width,
h = that.height,
scale = w / h;
w = obj.width || w;
h = obj.height || (w / scale);
var quality = 0.5; // 默認圖片質(zhì)量為0.7
//生成canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// 創(chuàng)建屬性節(jié)點
var anw = document.createAttribute("width");
anw.nodeValue = w;
var anh = document.createAttribute("height");
anh.nodeValue = h;
canvas.setAttributeNode(anw);
canvas.setAttributeNode(anh);
ctx.drawImage(that, 0, 0, w, h);
// 圖像質(zhì)量
if(obj.quality && obj.quality <= 1 && obj.quality > 0) {
quality = obj.quality;
}
// quality值越小,所繪制出的圖像越模糊
var base64 = canvas.toDataURL('image/jpeg', quality);
// 回調(diào)函數(shù)返回base64的值
callback(base64);
}
}
function convertBase64UrlToBlob(urlData) {
var arr = urlData.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime
});
}

以上是壓縮圖片的方法,核心是將圖片放入canvas內(nèi),再用canvas.toDataURL方法進行壓縮,最后生成一個Blob對象。

注:因為牽扯到canvas,所以低版本瀏覽器應該是不支持的吧(有待考證)

二、圖片壓縮的方法有了,怎么使用呢?怎么上傳到后臺呢?往下看!

html部分:

<form action="file/uploadDoc" enctype="multipart/form-data" method="post" id="form">
<input type="file" id="file" name="file" />
<input type="submit" value="上傳" />
</form>

js部分:

$("#file").change(function() {
var formData = new formData("form");
var file = this.files[0];
photoCompress(file, {
quality: 0.5,
}, function(base64Codes) {
var bl = convertBase64UrlToBlob(base64Codes);
formData.set("file", bl, file.name);
});
});

當選擇文件以后,使用photoCompress方法對上傳的圖片進行壓縮,photoCompress方法的第二個參數(shù)還可以傳入長寬等參數(shù),具體可以看photoCompress這個方法,quality是用來設置壓縮后圖片質(zhì)量的,越小質(zhì)量越差,表現(xiàn)出來就是圖片越模糊,但是相應的體積就越小。

最后使用formData.set(key,value,name)方法,將現(xiàn)有的name為file的表單元素的值改變。這個方法有三個參數(shù),第一個是key值,也就是表單里對應的元素的name值(如果不存在會自行添加),第二個值是value值,第三個是選填的值,如果第二個值為blob對象或者file對象,則第三個值表示文件名。

當然,如果你不想用form表單提交,你也可以用ajax提交的方法:

html:   

<form enctype="multipart/form-data" method="post" id="form">
<input type="file" id="file" name="file" />
<input type="button" value="上傳" id="uploadBtn"/>
</form>

有些許的變化,form沒有了action,上傳的按鈕type改為了button

js部分給按鈕添加一個點擊事件,其他也沒有變化,不做過多贅述:

$("#uploadBtn").click(function () {
var formData = new formData("form");
$.ajax({
type:"post",
url:"",
async:true,
data:formData,
success:function (data) {
},
error:function (e) {
}
});
});

三、結(jié)合layui踩的一些坑,以及最終的解決方法。

先看html部分:

<button type="button" class="layui-btn" id="upImg">上傳圖片</button>
<div id="img_list">
</div>
<input type="button" id = "btnHide" class="none">

就是這么簡單。為什么要再寫一個隱藏的按鈕,之后解釋。

js部分:

layui.use('upload', function() {
var upload = layui.upload;
var uploadInst = upload.render({
elem: '#upImg',
url: '/upload/',
auto: false,
bindAction: "#btnHide",
choose: function(obj) {
var files = obj.pushFile();
var index, file, indexArr = [];
for(index in files) {
indexArr.push(index);
};
var iaLen = indexArr.length;
file = files[indexArr[iaLen - 1]];
for(var i = 0; i < iaLen - 1; i++) {
delete files[indexArr[i]];
}
try {
if(file.size > 200 * 1024) {
delete files[index];
photoCompress(file, {
quality: 0.5,
}, function(base64Codes) {
var bl = convertBase64UrlToBlob(base64Codes);
obj.resetFile(index, bl, file.name);
$("#btnHide").trigger("click");
});
} else {
$("#btnHide").trigger("click");
}
} catch(e) {
$("#btnHide").trigger("click");
}
},
done: function(res) {
//這里把后臺返回的數(shù)據(jù)進行操作,展示上傳完成的圖片,具體數(shù)據(jù)格式參考layui的API
},
error: function() {
}
});
});

原理:在選擇照片之后,獲取文件,轉(zhuǎn)換為blob對象,使用resetFile方法對文件列隊里的文件進行重新設置,然后再觸發(fā)上傳事件。

踩的坑:

1、resetFile這個方法是layui 2.3.0 新增的,所以首先要確保layui的版本是最新的。

2、我把auto設置為false,點擊btnHide時觸發(fā)上傳,我也試過自動上傳,自動上傳的話,這些操作的代碼就要寫在before方法中(具體看layui的API),然而我發(fā)現(xiàn)自動上傳修改文件列隊的方法總是在上傳成功之后才調(diào)用,這就導致實際上傳的圖片其實沒有壓縮,至于為什么是這個執(zhí)行順序我隱約覺得是不是圖片轉(zhuǎn)碼,放入canvas的時候耽誤了……具體原因我不明白,所以我用手動上傳,確認修改了文件列隊,再手動觸發(fā)上傳。

3、關于文件列隊,多次上傳文件,文件列隊也就是obj.pushFile()返回的是多個文件的對象,而且這些文件對象的key還是一串隨機數(shù)……所以我的思路是上傳一次,就用delete方法刪除隊列中已上傳過的文件。至于為什么不直接全部清空,因為考慮到不需要壓縮的情況,如果全部清空,不壓縮,就沒有執(zhí)行resetFile方法,文件列隊里就沒有文件,會報錯。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaScript中Promise的簡單使用及其原理詳解

    JavaScript中Promise的簡單使用及其原理詳解

    Promise是ES6最重要的特性之一,今天小編就來帶大家一起系統(tǒng)且細致的研究一下Promise的用法以及原理,感興趣的小伙伴可以學習一下哦
    2023-03-03
  • 利用d3.js制作連線動畫圖與編輯器的方法實例

    利用d3.js制作連線動畫圖與編輯器的方法實例

    這篇文章主要給大家介紹了關于如何利用d3.js制作連線動畫圖與編輯器的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用d3.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • ES6擴展運算符的理解與使用場景

    ES6擴展運算符的理解與使用場景

    擴展運算符( spread )是三個點(...),它好比 rest 參數(shù)的逆運算,將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列,這篇文章主要給大家介紹了關于ES6擴展運算符的理解與使用場景的相關資料,需要的朋友可以參考下
    2021-09-09
  • JS+CSS3實現(xiàn)超炫的散列畫廊特效

    JS+CSS3實現(xiàn)超炫的散列畫廊特效

    這篇文章主要為大家詳細介紹了JS+CSS3實現(xiàn)超炫的散列畫廊特效,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • vue2.0實戰(zhàn)之基礎入門(1)

    vue2.0實戰(zhàn)之基礎入門(1)

    這篇文章主要為大家詳細介紹了vue2.0實戰(zhàn)第一篇基礎入門的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Javascript下IE與Firefox下的差異兼容寫法總結(jié)

    Javascript下IE與Firefox下的差異兼容寫法總結(jié)

    總結(jié)一部分IE和Firefox的javascript差異寫法,對于像書寫多瀏覽器兼容性更好的代碼,可以參考下。
    2010-06-06
  • 深入解析js輪播插件核心代碼的實現(xiàn)過程

    深入解析js輪播插件核心代碼的實現(xiàn)過程

    這篇文章主要深度揭密了js輪播插件核心代碼的實現(xiàn)過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 輕松掌握JavaScript裝飾者模式

    輕松掌握JavaScript裝飾者模式

    這篇文章主要幫助大家輕松掌握JavaScript裝飾者模式,告訴大家什么是js裝飾者模式,感興趣的小伙伴們可以參考一下
    2016-08-08
  • JS前端筆試題分析

    JS前端筆試題分析

    這篇文章主要介紹了JS前端筆試題,結(jié)合實例形式分析了javascript字符串、數(shù)組及日期操作相關技巧,需要的朋友可以參考下
    2016-12-12
  • 10大Js圖像處理庫

    10大Js圖像處理庫

    這篇文章主要介紹了10大Js圖像處理庫,對圖像處理感興趣的同學,可以參考下
    2021-04-04

最新評論

陕西省| 山东| 铁岭县| 灵山县| 三都| 桐城市| 宝山区| 介休市| 城步| 平凉市| 绍兴市| 徐水县| 西丰县| 安阳县| 积石山| 衡东县| 泸定县| 闽清县| 比如县| 丽水市| 甘谷县| 兴文县| 天镇县| 大荔县| 略阳县| 汉阴县| 铁岭市| 万安县| 甘孜县| 增城市| 海林市| 紫金县| 灌南县| 监利县| 芒康县| 苏尼特左旗| 六安市| 阳山县| 长宁县| 资中县| 伊通|