1. 程式人生 > >Java實現頭像擷取裁剪後圖片儲存,獲取的是base64資料,怎麼轉換為圖片並儲存到資料庫。並讀取出來。

Java實現頭像擷取裁剪後圖片儲存,獲取的是base64資料,怎麼轉換為圖片並儲存到資料庫。並讀取出來。

Java實現頭像拖拽擷取裁剪後圖片儲存,獲取的是base64資料,base64資料轉換為圖片後存入到資料庫。並讀取出來。

1.操作過程效果截圖:

  • 點選編輯頭像進入頭像上傳頁面

    這裡寫圖片描述

  • 頭像上傳頁面

    這裡寫圖片描述

  • 點選選擇圖片,選擇需要上傳的圖片進行拖拽裁剪

    這裡寫圖片描述

  • 裁剪後的圖片進行儲存

    這裡寫圖片描述

  • 儲存後的圖片存入資料庫,存入本地資料夾

    這裡寫圖片描述

    這裡寫圖片描述

2.需要的材料(html, js ,css),太多了我就不發出了,我這個也是下載那個然後自己修改的。下面是靜態Demo頁面的下載地址。

  • 百度頭像裁剪擷取拖拽也可以找到:

    這裡寫圖片描述

  • 下載後內容:

    這裡寫圖片描述

3.開啟靜態頁面,對頁面做簡單的修改。

  • 新增一個textarea文字域用來存取base64資料。
    <div id="text">
            <textarea rows="10" cols="100"></textarea>
    </div>

這裡寫圖片描述

  • js新增兩行: alert()用來測試,textarea用來存取base64資料。
    alert(cropper.getDataURL());
    $('#text textarea').val(cropper.getDataURL());

這裡寫圖片描述

  • 選擇圖片,測試:頁面texteare已經獲取。
    這裡寫圖片描述

4.將Js,css,html 加入 Java Web裡面。頁面加入form 表單,點選儲存時,把texteare的base64資料提交到controller控制器裡面進行base64資料轉為圖片,並儲存到資料庫和本地。

  • jsp頁面修改。

    這裡寫圖片描述

  • 建一個base64資料格式和圖片相互轉換的base64類。(重要)

package com.ssm.jock.utils;

import java.io.FileInputStream;
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  

import sun.misc.BASE64Decoder;  
import sun.misc.BASE64Encoder;  

public
class Base64 { //圖片轉化成base64字串 public static String GetImageStr(String imageName) {//將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理 String imgFile = imageName;//待處理的圖片 InputStream in = null; byte[] data = null; //讀取圖片位元組陣列 try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } //對位元組陣列Base64編碼 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data);//返回Base64編碼過的位元組陣列字串 } //base64字串轉化成圖片 public static boolean GenerateImage(String imgStr,String imageName) { //對位元組陣列字串進行Base64解碼並生成圖片 if (imgStr == null) //影象資料為空 return false; BASE64Decoder decoder = new BASE64Decoder(); try { //Base64解碼 byte[] b = decoder.decodeBuffer(imgStr); for(int i=0;i<b.length;++i) { if(b[i]<0) {//調整異常資料 b[i]+=256; } } //生成jpeg圖片 String imgFilePath = imageName;//新生成的圖片 OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); return true; } catch (Exception e) { return false; } } }
  • 控制器程式碼:
/**
     * 根據Id獲取該使用者的頭像並刪除
     * 獲取base64資料的圖片資料,轉為圖片格式存入指定資料夾裡面
     * @param buyerMess 使用者物件
     * @param text base64資料
     * @param request
     * @return
     * @throws Exception
     */
    @RequestMapping("/updateUserMess")
    public String updatePhotoUrl(
            BuyerMess buyerMess, 
            String text,
            Model model,
            HttpServletRequest request) throws Exception{
            //輸出base64 資料,擷取","之後的值進行轉換
            String str = text.substring(text.indexOf(",")+1);
            //System.currentTimeMillis()意思是獲取當前系統的時間戳給圖片命名
            //例項化Base64轉換類  呼叫裡面的GenerateImage方法(把base64資料轉為圖片)
            //第一個引數base64轉圖片的必須的base64資料,第二個是轉換後生成的圖片存放路徑
            Base64.GenerateImage(str, "D:/images/user_head/"+System.currentTimeMillis()+".jpg");
            //資料庫存入絕對路徑下的圖片名稱(上傳圖片即是修改操作)
            buyerMess.setPhotourl("D:/images/user_head/"+System.currentTimeMillis()+".jpg");
            buyerMess.setId("zhangsan");
            //根據使用者Id修改頭像圖片存的路徑
            Integer ret = buyerMessService.updatePhotoUrl(buyerMess);
            if(ret>0){
                System.out.println("存入成功");
            }else{
                System.out.println("存入失敗");
            }
        //呼叫查詢方法,返回到頁面
        return "redirect:/first.htm";
    }

4.為什麼需要擷取:因為獲取的base64資料不能識別前面帶“data:image/png;base64,”的。把這個擷取後才能被識別,否則生成不了。

  • 設定斷點,滑鼠懸浮到text上面,可以看到下面的base64資料已經傳入此方法裡面了。

    這裡寫圖片描述

  • 對base64資料進行擷取。(把“,”號之前的data:image/png;base64, 擷取掉,只需要後面的資料才能轉換)

    這裡寫圖片描述

5.總結:其實看上去很多,實際很簡單。大致分為5步。

  • 把前臺獲取的base64資料傳入後臺。
  • 把獲取的base64資料進行擷取,只需要“,”逗號之後的資料才能轉換。
  • 建立base64轉換的類,用於把base64資料轉為圖片。
  • 呼叫base64資料轉換為圖片的方法,引數(base64資料,圖片儲存地址)。
  • 設定資料庫的圖片路徑為圖片儲存路徑。