spring boot實(shí)現(xiàn)圖片上傳和下載功能
這篇博客簡單介紹下spring boot下圖片上傳和下載,已經(jīng)遇到的問題。首先需要?jiǎng)?chuàng)建一個(gè)spring boot項(xiàng)目。
1、核心的controller代碼
package com.qwrt.station.websocket.controller; import com.alibaba.fastjson.JSONObject; import com.qwrt.station.common.util.JsonUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; /** * Created by jack on 2017/10/30. */ @RestController @RequestMapping("v1/uploadDownload") public class UploadDownloadController { private static final Logger logger = LoggerFactory.getLogger(UploadDownloadController.class); @Value("${uploadDir}") private String uploadDir; @RequestMapping(value = "/uploadImage", method = RequestMethod.POST) public JSONObject uploadImage(@RequestParam(value = "file") MultipartFile file) throws RuntimeException { if (file.isEmpty()) { return JsonUtil.getFailJsonObject("文件不能為空"); } // 獲取文件名 String fileName = file.getOriginalFilename(); logger.info("上傳的文件名為:" + fileName); // 獲取文件的后綴名 String suffixName = fileName.substring(fileName.lastIndexOf(".")); logger.info("上傳的后綴名為:" + suffixName); // 文件上傳后的路徑 String filePath = uploadDir; // 解決中文問題,liunx下中文路徑,圖片顯示問題 // fileName = UUID.randomUUID() + suffixName; File dest = new File(filePath + fileName); // 檢測(cè)是否存在目錄 if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } try { file.transferTo(dest); logger.info("上傳成功后的文件路徑未:" + filePath + fileName); return JsonUtil.getSuccessJsonObject(fileName); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return JsonUtil.getFailJsonObject("文件上傳失敗"); } //文件下載相關(guān)代碼 @RequestMapping(value = "/downloadImage",method = RequestMethod.GET) public String downloadImage(String imageName,HttpServletRequest request, HttpServletResponse response) { //String fileName = "123.JPG"; logger.debug("the imageName is : "+imageName); String fileUrl = uploadDir+imageName; if (fileUrl != null) { //當(dāng)前是從該工程的WEB-INF//File//下獲取文件(該目錄可以在下面一行代碼配置)然后下載到C:\\users\\downloads即本機(jī)的默認(rèn)下載的目錄 /* String realPath = request.getServletContext().getRealPath( "http://WEB-INF//");*/ /*File file = new File(realPath, fileName);*/ File file = new File(fileUrl); if (file.exists()) { response.setContentType("application/force-download");// 設(shè)置強(qiáng)制下載不打開 response.addHeader("Content-Disposition", "attachment;fileName=" + imageName);// 設(shè)置文件名 byte[] buffer = new byte[1024]; FileInputStream fis = null; BufferedInputStream bis = null; try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); OutputStream os = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } System.out.println("success"); } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } } return null; } }
上面的代碼有兩個(gè)方法,上面的方法是圖片上傳的方法,下面的方法是圖片下載的方法。下載圖片需要傳入圖片的文件名,在ios,android手機(jī),谷歌瀏覽器測(cè)試,上傳下載沒有問題。
2、測(cè)試的html的核心代碼如下,進(jìn)行圖片的上傳和下載:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>websocket chat</title> </head> <body> <div> <label>輸入信息:</label><input id="id" width="100px" /><br /> <button id="btn">發(fā)送消息</button> <button id="connection">websocket連接</button> <button id="disconnection">斷開websocket連接</button> <br /><br /> <form enctype="multipart/form-data" id="uploadForm"> <input type="file" name="uploadFile" id="upload_file" style="margin-bottom:10px;"> <input type="button" id="uploadPicButton" value="上傳" onclick="uploadImage()"> </form> <!--<input type="file" onchange="uploadImgTest();" id="uploadImg" name="uploadImg" /> <button id="uploadImage" onclick="uploadImage();">上傳</button>--> </div> <div id="test"> </div> <hr color="blanchedalmond"/> <div id="voiceDiv"> </div> <hr color="chartreuse" /> <div id="imgDiv" style="width: 30%;height: 30%;"> <img src="http://192.168.9.123:8860/v1/uploadDownload/downloadImage?imageName=123.JPG" style="width: 160px;height: 160px;"/> </div> </body> <script src="js/jquery-3.2.1.min.js"></script> <!--<script th:src="@{stomp.min.js}"></script>--> <script src="js/sockjs.min.js"></script> <script> var websocketUrl = "ws://192.168.9.123:8860/webSocketServer"; var websocket; if('WebSocket' in window) { //websocket = new WebSocket("ws://" + document.location.host + "/webSocketServer"); //websocket = new WebSocket("ws://192.168.9.123:9092/webSocketServer"); //websocket = new WebSocket("ws://localhost:8860/webSocketServer"); websocket = new WebSocket(websocketUrl); } else if('MozWebSocket' in window) { websocket = new MozWebSocket("ws://" + document.location.host + "/webSocketServer"); } else { websocket = new SockJS("http://" + document.location.host + "/sockjs/webSocketServer"); } websocket.onopen = function(evnt) { console.log("onopen----", evnt.data); }; websocket.onmessage = function(evnt) { //$("#test").html("(<font color='red'>" + evnt.data + "</font>)"); console.log("onmessage----", evnt.data); //$("#test").html(evnt.data); $("#test").append('<div>' + event.data + '</div>'); }; websocket.onerror = function(evnt) { console.log("onerror----", evnt.data); } websocket.onclose = function(evnt) { console.log("onclose----", evnt.data); } $('#btn').on('click', function() { if(websocket.readyState == websocket.OPEN) { var msg = $('#id').val(); //調(diào)用后臺(tái)handleTextMessage方法 websocket.send(msg); } else { alert("連接失敗!"); } }); $('#disconnection').on('click', function() { if(websocket.readyState == websocket.OPEN) { websocket.close(); //websocket.onclose(); console.log("關(guān)閉websocket連接成功"); } }); $('#connection').on('click', function() { if(websocket.readyState == websocket.CLOSED) { websocket.open(); //websocket.onclose(); console.log("打開websocket連接成功"); } }); //監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。 window.onbeforeunload = function() { websocket.close(); } function uploadImgTest() { } function uploadImage(){ //var uploadUrl = "http://localhost:8860/v1/uploadDownload/uploadImage"; var uploadUrl = "http://192.168.9.123:8860/v1/uploadDownload/uploadImage"; var downUrl = "http://192.168.9.123:8860/v1/uploadDownload/downloadImage" var pic = $('#upload_file')[0].files[0]; var fd = new FormData(); //fd.append('uploadFile', pic); fd.append('file', pic); $.ajax({ url:uploadUrl, type:"post", // Form數(shù)據(jù) data: fd, cache: false, contentType: false, processData: false, success:function(data){ console.log("the data is : {}",data); if(data.code == 0){ console.log("上傳成功后的文件路徑為:"+data.data); var img = $("<img />") img.attr("src",downUrl+"?imageName="+data.data); img.width("160px"); img.height("160px"); $("#imgDiv").append(img); } } }); } </script> </html>
上面的代碼有些和圖片的上傳和下載沒有關(guān)系,根據(jù)需要自己去掉,看圖片上傳和下載的核心代碼,需要引入jquery。
3、spring boot的屬性配置:
1.解決圖片上傳太大的問題:
spring: http: multipart: max-file-size: 100Mb #文件上傳大小 max-request-size: 200Mb #最打請(qǐng)求大小
這是新版spring boot解決圖片或者文件上傳太大的問題,老板的不是這樣解決的??梢宰约翰橘Y料
2.配置文件上傳保存的位置:
#上傳位置 uploadDir: F:\mystudy\pic\
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
元宵節(jié)福利:
- 詳解SpringBoot文件上傳下載和多文件上傳(圖文)
- springboot實(shí)現(xiàn)文件上傳和下載功能
- 詳解SpringBoot下文件上傳與下載的實(shí)現(xiàn)
- Spring Boot + thymeleaf 實(shí)現(xiàn)文件上傳下載功能
- SpringBoot實(shí)現(xiàn)文件上傳下載功能小結(jié)
- springboot整合vue實(shí)現(xiàn)上傳下載文件
- Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板)
- Spring Boot 文件上傳與下載的示例代碼
- SpringBoot 文件上傳和下載的實(shí)現(xiàn)源碼
- Spring?Boot實(shí)現(xiàn)文件上傳下載
相關(guān)文章
Springboot之idea之pom文件圖標(biāo)不對(duì)問題
這篇文章主要介紹了Springboot之idea之pom文件圖標(biāo)不對(duì)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04SpringBoot項(xiàng)目如何將Bean注入到普通類中
這篇文章主要介紹了SpringBoot項(xiàng)目如何將Bean注入到普通類中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringCloud客戶端報(bào)錯(cuò):- was unable to send&nb
這篇文章主要介紹了SpringCloud客戶端報(bào)錯(cuò):- was unable to send heartbeat!的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析
這篇文章主要介紹了Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析,List是有序集合的根接口,Set是無序集合的根接口,無序也就意味著元素不重復(fù),更嚴(yán)格地說,Set集合不包含一對(duì)元素e1和e2 ,使得e1.equals(e2) ,并且最多一個(gè)空元素,需要的朋友可以參考下2023-09-09Java基礎(chǔ)之Math和Random類知識(shí)總結(jié)
今天帶大家來學(xué)習(xí)java的Math和Random類,文中有非常詳細(xì)的代碼示例及介紹,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們很有幫助喲,需要的朋友可以參考下2021-05-05