通過(guò)js實(shí)現(xiàn)壓縮圖片上傳功能
大概的流程就是
- 點(diǎn)擊file選擇圖片
- js將圖片解讀出base64編碼,然后通過(guò)js將base64編碼轉(zhuǎn)為壓縮后的base64
- 然后通過(guò)ajax或者form把壓縮后的base64編碼提交到服務(wù)器(php)
- 然后php將base64寫(xiě)入文件
html
<!-- 首先引入jquery!!!!!!這里沒(méi)有引入 -->
<img src="/Uploads/verifyinfo/cardz.png" style="width: 100%;height: 100%;">
<input id="cardz" name="cardz" class="weui-uploader__input" type="file" accept="image/*" multiple="">
<input type="hidden" id="cardzbase" name="cardzbase">
<script>
$(function(){
$("input[type=file]").on('change', function(){
var filePath = $(this).val(), //獲取到input的value,里面是文件的路徑
fileFormat = filePath.substring(filePath.lastIndexOf(".")).toLowerCase(),
fileObj = document.getElementById($(this).attr('id')).files[0]; //上傳文件的對(duì)象,要這樣寫(xiě)才行,用jquery寫(xiě)法獲取不到對(duì)象
var imgBase64str = ''; //存儲(chǔ)圖片的imgBase64
// 檢查是否是圖片
if( !fileFormat.match(/.png|.jpg|.jpeg/) ) {
alert('上傳錯(cuò)誤,文件格式必須為:png/jpg/jpeg');
return;
}
var that = this;
// 調(diào)用函數(shù),對(duì)圖片進(jìn)行壓縮
compress(fileObj,function(imgBase64){
imgBase64str = imgBase64;//存儲(chǔ)轉(zhuǎn)換后的base64編碼
var reader = new FileReader();
var img = $(that).prev("img")
file = that.files[0]
reader.addEventListener("load", function () {
img.attr("src",imgBase64str);
$("#"+$(that).attr('id')+"base").val(imgBase64str);
}, false);
reader.readAsDataURL(file)
});
})
$("#uploadcard").on("click", function(){
var cardzbase = $("#cardzbase").val();
if (cardzbase.length<=0) {
$.toast("請(qǐng)?zhí)砑诱嬲?);
return;
}
$.post(
"php路徑",
{
cardzbase:cardzbase
},
function (data) {
alert(data.msg);
}
);
});
})
// 對(duì)圖片進(jìn)行壓縮
function compress(fileObj, callback){
if ( typeof (FileReader) === 'undefined') {
console.log("當(dāng)前瀏覽器內(nèi)核不支持base64圖標(biāo)壓縮");
//調(diào)用上傳方式不壓縮
directTurnIntoBase64(fileObj,callback);
} else {
var reader = new FileReader();
reader.onload = function (e) { //要先確保圖片完整獲取到,這是個(gè)異步事件
var image = new Image();
image.src=e.target.result;
image.onload = function(){
square = 0.2, //定義畫(huà)布的大小,也就是圖片壓縮之后的像素
canvas = document.createElement('canvas'), //創(chuàng)建canvas元素
context = canvas.getContext('2d'),
imageWidth = Math.round(square*image.width), //壓縮圖片的大小
imageHeight = Math.round(square*image.height),
data = '';
canvas.width = imageWidth;
canvas.height = imageHeight;
context.clearRect(0, 0, imageWidth, imageHeight); //在給定矩形內(nèi)清空一個(gè)矩形
context.drawImage(this, 0, 0, imageWidth, imageHeight);
var data = canvas.toDataURL('image/jpeg',0.6);
//壓縮完成執(zhí)行回調(diào)
callback(data);
};
};
reader.readAsDataURL(fileObj);
}
}
// 不對(duì)圖片進(jìn)行壓縮,直接轉(zhuǎn)成base64
function directTurnIntoBase64(fileObj,callback){
var r = new FileReader();
// 轉(zhuǎn)成base64
r.onload = function(){
//變成字符串
imgBase64 = r.result;
//console.log(imgBase64);
callback(imgBase64);
}
r.readAsDataURL(fileObj); //轉(zhuǎn)成Base64格式
}
</script>
php
<?php
/**
* [將Base64圖片轉(zhuǎn)換為本地圖片并保存]
* @param $base64_image_content [要保存的Base64]
* @param $path [要保存的路徑]
* @return bool|string
*/
public function base64_image_content($base64_image_content,$path){
//匹配出圖片的格式
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
$type = $result[2];
//生成文件名
$file_name = random_str(10).".{$type}";
//路徑和文件名拼接
$local_file_url = $path.$file_name;
if (file_put_contents($local_file_url, base64_decode(str_replace($result[1], '', $base64_image_content)))){
return array("filename"=>$file_name,"path"=>$path,"filepath"=>$local_file_url);
}else{
return false;
}
}else{
return false;
}
}
public function uploadm()
{
$da['status'] = 0;
if (IS_POST) {
$infoz = I("post.cardzbase");
if (!$infoz || !$infof) {
// 上傳錯(cuò)誤提示錯(cuò)誤信息
// $this->error($upload->getError());
$da['msg'] = "上傳異常";
} else {
$infoz_info = $this->base64_image_content($infoz,"Uploads/verifyinfo/");
if($infof_info==false){
$da['msg'] = "上傳失敗";
}else{
//自己的業(yè)務(wù)...
}
}
}else{
$da['msg'] = "非法請(qǐng)求";
}
$this->ajaxReturn($da);
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于javascript的COOkie的操作實(shí)現(xiàn)只能點(diǎn)一次
這篇文章主要介紹了基于javascript的COOkie的操作實(shí)現(xiàn)只能點(diǎn)一次,需要的朋友可以參考下2014-12-12
javascript入門(mén)之string對(duì)象【新手必看】
本片文章主要介紹String 對(duì)象的屬性方法等并進(jìn)行舉例說(shuō)明,小編認(rèn)為對(duì)大家學(xué)習(xí)JavaScript是有所幫助的,需要朋友的可以看下2016-11-11
IntelliJ IDEA 安裝vue開(kāi)發(fā)插件的方法
本篇文章主要介紹了IntelliJ IDEA 安裝vue開(kāi)發(fā)插件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
javascript按指定格式輸出文件最后更新時(shí)間
javascript按指定格式輸出文件最后更新時(shí)間...2007-08-08
js實(shí)現(xiàn)簡(jiǎn)單圓盤(pán)時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單圓盤(pán)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
JavaScript對(duì)JSON數(shù)組簡(jiǎn)單排序操作示例
這篇文章主要介紹了JavaScript對(duì)JSON數(shù)組簡(jiǎn)單排序操作,結(jié)合實(shí)例形式分析了javascript使用sort()方法針對(duì)json數(shù)組元素排序的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-01-01
?javascript數(shù)組中的findIndex方法?
這篇文章主要介紹了javascript數(shù)組中的findIndex方法,findIndex()?方法返回傳入一個(gè)測(cè)試條件函數(shù)符合條件的數(shù)組第一個(gè)元素位置,下面更多相關(guān)資料,需要的小伙伴可以參考一下2022-03-03
JS實(shí)現(xiàn)圖片預(yù)加載無(wú)需等待
網(wǎng)站開(kāi)發(fā)時(shí)經(jīng)常需要在某個(gè)頁(yè)面需要實(shí)現(xiàn)對(duì)大量圖片的瀏覽;用javascript來(lái)實(shí)現(xiàn)一個(gè)圖片瀏覽器,讓用戶無(wú)需等待過(guò)長(zhǎng)的時(shí)間就能看到其他圖片2012-12-12

