base64編碼的圖片存入數據庫的地址爲服務器,如果前端獲取不到base64編碼的話,需要把圖片路徑轉換成文件,再把File文件轉成base64,發送給後臺,接口獲取文件流,轉成文件放在服務器地址,然後獲取服務器的地址再存入數據庫。
前端JS:
/**拍照
* @param {Object} c
* @param {Object} d
*/
var base64src="";//全局變量
var upload = function(c, d) {
"use strict";
var $c = document.querySelector(c),
$d = document.querySelector(d),
file = $c.files[0],
picPath = $c.value,
reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e) {
$d.setAttribute("src", e.target.result);
base64src = e.target.result;//獲取base64編碼的字符串
};
};
獲取到的base64編碼如圖,(特別長)
FileReader 是H5提供的一個處理文件的API
FileReader對象的方法如下:
readAsBinaryString(file): 這個方法將blob對象或文件中的數據讀取爲二進制字符串,通常我們將它傳送到服務器端,服務器端可以通過這段字符串存儲文件。
readAsText(file,encoding): 以純文本形式讀取文件,將讀取到的文本保存在result屬性中,第二個參數用於指定編碼類型,可選的。
readAsDataURL(file): 讀取文件並將文件以數據URL的形式保存在result屬性中。
readAsArrayBuffer(file): 讀取文件並將一個包含文件內容的ArrayBuffer保存在result屬性中。
FileReader對象的事件如下:
onabort: 數據讀取中斷時觸發、
onerror: 數據讀取出錯時觸發、
onloadstart: 數據讀取開始時觸發、
onprogress: 數據讀取中、
onload:數據讀取成功完成時觸發、
onloadend: 數據讀取完成時觸發,無論成功或失敗。
注意:重點內容
FileReader 讀取後的文件不會返回給FileReader 本身, 而是存儲在了 result 中
後端代碼:
//1,獲取到後面的數據
String base64src=request.getParameter("base64src");
String base64=base64src.split(",")[1];//通過base64來轉化圖片,去掉圖片頭(data:image/jpg;base64,)
//2,解碼成字節數組
byte[] result=BASE64.decode(new String(base64));
//3,字節流轉文件
String uuid=FileUtils.getUUID();//uuid作爲保存時的文件名
File picfilepath=new File(BaseConfig.webPath+"upload/kq/"+uuid+".png");//保存文件
File filepath=new File(BaseConfig.webPath+"upload/kq/");//創建文件夾
if(!filepath.exists()){//如果沒有文件夾,新建
filepath.mkdirs();
}
try{
FileOutputStream out=new FileOutputStream(picfilepath);
out.write(result);
out.close();
}catch(Exceptione){
e.printStackTrace();
}
1/後端接收前端傳入的數據顯示
2/走完流程,成功存儲到服務器的路徑下
3/獲取服務器地址存入數據庫表
問題:post方法上傳 base64編碼的圖片傳到後端爲null
原因:base64編碼的圖片太大了,post請求理論上對參數的大小沒有限制,但是服務器有限制,把Tomcat的server.xml裏設置一下就好了
注:
Tomcat的版本低於等於7,設置maxPostSize=“0” 表示post參數無限大
Tomcat的版本大於等於8,設置maxPostSize=“104857600” 表示post參數最大100MB