做爲一個初出茅廬的菜鳥,這幾天作了一下附件的上傳與下載,附件文件存儲在mysql中,數據類型爲blob。在此作一下總結。望指正。前端
一.先總結附件的上傳。(實質是將文件傳到controller,後處理成二進制數據 纔可以保存到數據庫blob數據中)mysql
個人目的是將文件保存在mysql的某一條記錄中,須要經過頁面上傳文件到後臺。ajax
1.經過頁面進行文件的上傳,使用ajax,經過form表單以formData來將文件上傳,刪除沒必要要的內容。spring
前臺代碼:<form id="file" method="post" action="{{url}}" enctype="multipart/form-data">sql
<div class="file-container">數據庫
<button type="button" onclick="">上傳</button>數組
<input type="file" name="file" id="file1" onchange="loadFile(this.files[0])" style="position: absolute; top: 0; left: 0; opacity: 0">springboot
</div>app
<button class="btn btn-primary" id="excelImp" type="button">導入</button>async
</form>
$('#excelImp').click(function(){
var formData = new FormData();
/*var formData = new FormData($("#file")[0]);*/ 序列化表單的一種作法,能夠上傳文件。
var file = $('#file1').get(0).files[0];
formData.append("id",rows[0].taskId)
formData.append("file",file)
$.ajax({
url : " ",
type : "POST",
data :formData,
async : false,
cache : false,
contentType : false,//必須false纔會自動加上正確的Content-Type
processData : false,//必須false纔會避開jQuery對 formdata 的默認處理.XMLHttpRequest會對 formdata 進行正確的處理.
success : function() {
},
error : function() {
}
})
})
解釋一下,定義新的formData數據後,能夠以鍵值對的形式,將想要傳到後臺的數據命名填入。
要想將表單數據和文件一塊兒傳入到後臺接收,只需在form標籤中的與數據相關的標籤name屬性一一對應,就能夠傳輸!
後臺代碼:controller接受 參數與ajax的formData 的 key進行對應,例如@RequestParam(value = "file")MultipartFile file, @RequestParam(value = "id") String id
這樣控制器就能夠接收到文件和一個id。
控制器獲取到文件和id後,我出現了一個問題:我項目使用的springboot和springcloud,在不一樣模塊的調度過程當中,使用了restTemplate將參數由前端模塊的控制器
傳到另外一個模塊的控制器,怎麼嘗試都沒法直接將MultipartFile的文件傳輸,因此對其進行了處理,將file轉成了字節數組,才進行了傳遞。(對於我來講,爲了更保險, 我將字節數組轉成了String 才進行的傳輸)。
String afile = null; InputStream ins = file.getInputStream(); byte[] buffer=new byte[1024];
int len=0; ByteArrayOutputStream bos=new ByteArrayOutputStream();
while((len=ins.read(buffer))!=-1){
bos.write(buffer,0,len);
} bos.flush(); byte data[] = bos.toByteArray(); afile= new String (data);
在實現類中接收到String 後,將其轉成byte[] 經過jdbc對mysql的操做,將其插入到數據庫中。
Connection con = null; Statement statement = null; Statement statement = null;
Class.forName(driver); con = DriverManager.getConnection(url,user,password);
String sql= "update XXX set XXX=?,XXX=?"+" where TASK_ID=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setBytes(1, data); data爲file轉換成的byte[]數組,可直接存入到blob類型的數據
pstmt.setString(2, taskReceiveAccessoryName);
pstmt.setString(3, id); pstmt.executeUpdate(); 最後關閉數據庫的鏈接