1. 程式人生 > >HTML5+canvas實現圖片的壓縮上傳

HTML5+canvas實現圖片的壓縮上傳

1.圖片上傳輸入框

<input type="file" name="" class="fileUpload" accept="image/*" capture="camera"/>

2.上面時候觸發onchange

$('.fileUpload').on('change', function () {
    id = $(this).parent().attr("id");
    //上傳成功移除file input
    $(this).parent().children().remove();
    var _this = $(this)[0],
        _file = _this.files[0],//裡面存放是圖片資訊
        fileType = _file.type;
    console.log(_file.size);
    if(/image\/\w+/.test(fileType)){
        $.showLoading("圖片上傳中...");
        var fileReader = new FileReader();
        fileReader.lastModifiedDate = _file.lastModifiedDate
        fileReader.name = _file.name
        fileReader.readAsDataURL(_file);
        fileReader.onload = function(event){
            var result = event.target.result;   //返回的dataURL
            var image = new Image();
            image.src = result;
            image.onload = function(){  //建立一個image物件,給canvas繪製使用
                //通過canvas生成base64字串,後臺會解析這個字串,dataURL是最終生成的字串
              var canvas = document.createElement("canvas");
              canvas.width = this.width;
              canvas.height = this.height;
              var c = canvas.getContext("2d");
              c.drawImage(this, 0, 0, this.width, this.height);
              var dataURL = canvas.toDataURL("image/jpeg");
$.post(ctx + '/base/front/photoInfo/uploadPicture.sy',{ 'file': dataURL, //base64字串 'fileDate': (typeof (event.target.lastModifiedDate) != 'undefined' ? event.target.lastModifiedDate : new Date()).Format("yyyy-MM-dd hh:mm:ss"),//圖片修改時間,通過這個來判斷是否是直接拍攝的照片 'fileName': event.target.name//照片名稱 },function(data, code){   $.hideLoading(); $.modal({ title: ' ', text: "上傳成功!" }); },'json'); } } }else{ $.modal({ title: ' ', text: "請選擇圖片格式檔案!" }); }});

3.後臺程式碼:

1.在Controller或者Action中呼叫,所需的引數file是上面post請求中所攜帶的dataURL,即base64字串。FileUpload是自己寫的一個Class,進行處理base64字串

FileUpload upload = new FileUpload(file.split(",")[1]);
JSONObject jsonObject = upload.uploadFlowFile();//savePath

2.在FileUpload中的方法,下面用到的fileFlow引數是上面new FileUpload時傳進的引數

用到的是 sun.misc.BASE64Decoder包

        /**
	 * 方法名稱:
	 * 方法描述:上傳檔案
	 * 建立時間:2015-9-29 下午1:39:03
	 */
	public JSONObject uploadFlowFile() throws Exception{
		JSONObject json=new JSONObject();
		try {
			finishedFlowUpload("uploadPath");
			json.put("msg", this.getSavePath());
			json.put("fileName", this.getFiledataFileName());
			json.put("savePath", this.getSavePath());
			json.put("status", true);
		} catch (Exception e) {
			e.printStackTrace();
			json.put("status", false);
		} 
		return json;
	}
protected void finishedFlowUpload(String savePathKey) throws Exception {
    	// 根據伺服器的檔案儲存地址和原檔名建立目錄檔案全路徑
    	String dstPath = null; 
    	// 儲存路徑
    	String bsPath = null;
    	// 檔案型別
    	String fileType = ".png";
    	String uuidName = null;
    	if(null!=savePathKey){
    		dstPath = ConfigUtil.get(savePathKey);//spring boot配置的儲存路徑
    	}  
    	if(null==dstPath||"".equals(dstPath)){
    		dstPath = ServletActionContext.getServletContext().getRealPath("/");
    	}
    	bsPath = "/" + DateUtil.dateToString(DateUtil.getNow(),DateUtil.SYS_DATE_FORMAT) + "/";
    	File f1 = new File(dstPath+bsPath);
    	if (!f1.exists()) {
    		f1.mkdirs();
    	}
    	
    	uuidName = UUID.randomUUID().toString();
    	bsPath = bsPath + uuidName + fileType;
    	dstPath = dstPath + bsPath;
    	File dstFile = new File(dstPath);
    	copyFlow(fileFlow, dstFile);
    	setSavePath(new ArrayList<String>());
    	this.getSavePath().add(bsPath);
}
protected static void copyFlow(String fileInputStream, File dst) {
        OutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream(dst),
                    BUFFER_SIZE);
            BASE64Decoder base64Decoder = new BASE64Decoder();
            byte[] result = base64Decoder.decodeBuffer(fileInputStream);//解碼
            for (int i = 0; i < result.length; ++i) {
	            if (result[i] < 0) {// 調整異常資料
	            	result[i] += 256;
	            }
            }
            out.write(result);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != out) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

參考連結:

相關推薦

微信小程式呼叫攝像頭,實現圖片壓縮

這篇文章主要為大家詳細介紹了微信小程式實現圖片壓縮功能,具有一定的參考價值,感興趣的小夥伴們可以參考一下,下面直接上程式碼 先是wxml: <view bindtap='takePictures'>選擇圖片</view> <canv

HTML5+canvas實現圖片壓縮

1.圖片上傳輸入框<input type="file" name="" class="fileUpload" accept="image/*" capture="camera"/>2.上面時候觸發onchange$('.fileUpload').on('chang

JS+HTML5實現前端的圖片壓縮到騰訊的COS

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <meta name="viewport" content="w

Vue directive自定義指令+canvas實現H5圖片壓縮-Base64格式

前言 最近優化專案-手機拍照圖片太大,回顯速度比較慢,使用了vue的自定義指令實現H5壓縮上傳base64格式的圖片 canvas自定義指令 Vue.directive("canvas",

JS圖片,利用canvas實現圖片壓縮

操作 base64 itob 思考 旋轉角度 基礎 inpu url 一位 項目中的一個基礎功能-----手機上傳圖片 技術棧: 1、利用canvas進行壓縮(這個應該都比較熟悉)2、利用exif-js獲取照片旋轉角度屬性,因為有些手機機型會因為拍照時手機的方向使拍的照片帶

基於html5 JS實現的拍照圖片

<style> #video,#canvas {display: block;margin:1em auto;width:180px;height:180px;} #snap { display: block;margin:0 auto;width:80%;he

Spring 使用七牛雲端儲存圖片以及html5圖片壓縮

需求: 最近在做專案的時候採用了多模組的方案 前臺是一個系統 後臺是另一個系統 在做圖片上傳的時候有個問題 如果想之前那樣前臺系統的圖片儲存的自己的web應用目錄下 後臺系統是沒法訪問的 (直接寫死路徑不太好) 這裡我想到了兩個方案 方案一:自己搭建

HTML5 本地裁剪圖片至伺服器 canvas圖片 canvas圖片裁剪

很多情況下使用者上傳的圖片都需要經過裁剪,比如頭像啊什麼的。但以前實現這類需求都很複雜,往往需要先把圖片上傳到伺服器,然後返回給使用者,讓使用者確定裁剪座標,傳送給伺服器,伺服器裁剪完再返回給使用者,來回需要 5 步。步驟繁瑣不說,當很多使用者上傳圖片的時候也很影響伺服器

H5+jqweui實現手機端圖片壓縮 Base64

主要功能,使用H5的formData上傳base64格式的圖片,canvas壓縮圖片,前端樣式使用weui,為方便起見,使用了jquery封裝過的weui,jqweui。話不多少,開始上程式碼。前端程式碼,直接在jqweui官網下的demo裡改的(是dist下的demo)<!DOCTYPE html&g

H5+jqweui實現手機端圖片壓縮

主要功能,使用H5的formData上傳base64格式的圖片,canvas壓縮圖片,前端樣式使用weui,為方便起見,使用了jquery封裝過的weui,jqweui。 話不多少,開始上程式碼。 前端程式碼,直接在jqweui官網下的demo裡改的(是dist下的demo) <!DOCTYPE ht

HTML5 canvas實現圖片拉伸、壓縮與裁剪

前言: 我們在網頁中經常會用到圖片展示,通常情況下會給一個固定的寬高來顯示這個圖片,然而從伺服器端上傳的圖片大小是不確定的,如果直接按預設填充這個框有時候就會特別醜orz。作為一個完(wai)美(mao)主(xie)義(hui)者,讓圖片們儘可能優美

H5實現多圖與預覽,圖片壓縮

 H5多圖上傳,並實現壓縮(可根據實際情況選擇對多大的圖片進行壓縮,本例為大於512KB的進行壓縮)和預覽 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT

移動端圖片壓縮解決方案

長度 繪制圖片 slice ase 但是 choose 100萬 lis 計算 最近做移動端圖片上傳,發現圖片尤其是iPhone拍照的圖片都有2M左右,但是實際上項目中用不到這麽大,於是想到要用js在前臺進行壓縮。 解決方案如下:  【一】獲取圖片數據   先是獲取圖片數據

前端圖片壓縮(純js的質量壓縮,非大小壓縮)

默認 || callback doc 圖片格式 toc jpeg rtb src 此demo為大於1M對圖片進行壓縮上傳 若小於1M則原圖上傳,可以根據自己實際需求更改。 demo源碼如下: <!DOCTYPE html> <html> <h

移動前端圖片壓縮

safari 嘻嘻 如果 tee ini andro 並且 ons create   摘要:之前在做一個小遊戲平臺項目,有個“用戶中心”模塊,就涉及到了頭像上傳的功能。在做移動端圖片上傳的時候,傳的都是手機本地圖片,而本地圖片一般都相對比較大,拿現在的智能手機來說,平時拍很

vue裏圖片壓縮組件

UNC cep accept posit click toa dcl v-on ati //單圖上傳 <template> <div> <div class="uploader" v-if=‘!dwimg‘&g

summernote富文字編輯器實現圖片新增和刪除圖片

summernote的基本使用 HTML程式碼 //div添加個id就可以 <div id="summernote" ></div> 然後JS操作 //例項化呼叫 var $summernote = $('#summernote').summernote(

javaweb實現圖片檔案

圖片上傳到檔案中,可以直接上傳圖片到目錄中,也還可以將圖片檔名、檔案路徑寫入到資料庫中,也可以在程式中動態的建立檔案路徑。 參看:http://blog.csdn.net/lmdcszh/article/details/9201173 package com.ioif.wha.ima

node實現圖片功能

目標   圖片的上傳 npm install multer --save banner.ejs <section class="content-header">       

TP框架圖片壓縮/

<-- 在前端的程式碼 --><form action="{:url('index/user/personal')}" method="post" enctype="multipart/form-data"> <input type="file" name="image"