Spring MVC 圖片的上傳和下載功能
序言
SSM 框架是一種基于Java的Web開發(fā)框架,其中Spring作為控制層、SpringMVC作為視圖層、MyBatis作為持久層,這個(gè)框架非常適合Web應(yīng)用程序的開發(fā)。在這篇文章中,我們將使用 SSM 框架來實(shí)現(xiàn)圖片的上傳和下載功能。
首先,我們需要準(zhǔn)備好一個(gè)基本的SSM框架環(huán)境,也就是需要一個(gè)Tomcat服務(wù)器、Spring、SpringMVC和MyBatis等開發(fā)工具。
接著創(chuàng)建一個(gè)名為Image的Java類來存儲(chǔ)圖片的信息。該類包含以下字段:id、name、path、size、createTime、type、等。
思路一:瀏覽器圖片的上傳下載顯示通過本地實(shí)現(xiàn)
下面我們來實(shí)現(xiàn)具體的功能:
1、圖片上傳功能
在控制層中,我們創(chuàng)建一個(gè)名為UploadController的類來處理上傳請(qǐng)求。在該類中,我們需要添加一個(gè)方法,該方法用于處理上傳請(qǐng)求并返回上傳結(jié)果。在該方法中,我們需要使用SpringMVC提供的 MultipartResolver 類來解析上傳的文件,獲取文件信息,并將文件保存到服務(wù)器上。以下是UploadController類中的代碼:
@Controller @RequestMapping("/upload") public class UploadController { @RequestMapping(value = "/image", method = RequestMethod.POST) @ResponseBody public String uploadImage(@RequestParam("file") MultipartFile file) { String fileName = file.getOriginalFilename(); String path = "D:/uploads/" + fileName; try { File dest = new File(path); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } file.transferTo(dest); return "success"; } catch (Exception e) { e.printStackTrace(); return "error"; } } }
2、圖片下載功能
在控制層中,我們創(chuàng)建一個(gè)名為DownloadController的類來處理下載請(qǐng)求。在該類中,我們需要添加一個(gè)方法,該方法用于處理下載請(qǐng)求并返回下載結(jié)果。在該方法中,我們需要使用SpringMVC提供的 ResponseEntity 類來返回文件流并設(shè)置相關(guān)的頭信息。以下是DownloadController類中的代碼:
@Controller @RequestMapping("/download") public class DownloadController { @RequestMapping(value = "/image/{id}", method = RequestMethod.GET) public ResponseEntity<byte[]> downloadImage(@PathVariable("id") int id) { Image image = imageService.getImageById(id); String fileName = image.getName(); String path = "D:/uploads/" + fileName; try { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", fileName); File file = new File(path); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); } catch (Exception e) { e.printStackTrace(); return null; } } }
以上代碼中,我們使用了 imageService.getImageById(id) 方法來獲取要下載的圖片的信息,這個(gè)方法可以自己實(shí)現(xiàn)或借助MyBatis框架讀取數(shù)據(jù)庫(kù)獲取數(shù)據(jù)。
最后,在SpringMVC的配置文件spring-servlet.xml中,添加以下配置信息,以支持文件上傳和下載功能:
<!-- 文件上傳配置 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="10485760" /> </bean> <!-- 文件下載配置 --> <mvc:resources mapping="/download/**" location="file:/D:/uploads/" />
這樣,我們就完成了圖片上傳和下載的功能實(shí)現(xiàn)。通過SSM框架的整合,我們可以很方便地實(shí)現(xiàn)文件上傳和下載的功能。
。
思路二:瀏覽器圖片的上傳下載顯示通過數(shù)據(jù)庫(kù)實(shí)現(xiàn)
SSM 將圖片添加到數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)讀取到前端頁(yè)面實(shí)質(zhì)上是對(duì)數(shù)據(jù)庫(kù)中的二進(jìn)制數(shù)據(jù)進(jìn)行操作,以下是常用的實(shí)現(xiàn)方式:
1、將圖片添加到數(shù)據(jù)庫(kù)
(1)在數(shù)據(jù)庫(kù)中添加一個(gè)表,用于存儲(chǔ)圖片數(shù)據(jù),表結(jié)構(gòu)如下:
CREATE TABLE tb_image( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(255) NOT NULL COMMENT '文件名', `image` longblob NOT NULL COMMENT '圖片數(shù)據(jù)', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='圖片表';
其中,id為主鍵自增長(zhǎng),name用于存儲(chǔ)文件名,image用于存儲(chǔ)圖片數(shù)據(jù)。
(2)在 Java 代碼中先讀取圖片數(shù)據(jù),然后將其插入到數(shù)據(jù)庫(kù)中,示例代碼如下:
public void addImage(String name, String imagePath) { try { FileInputStream fis = new FileInputStream(imagePath); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO tb_image(name,image) VALUES(?,?)"); pstmt.setString(1, name); // 設(shè)置文件名 pstmt.setBinaryStream(2, fis, fis.available()); // 設(shè)置圖片數(shù)據(jù) pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { e.printStackTrace(); } }
其中,name為文件名,imagePath為圖片路徑,fis為讀取圖片數(shù)據(jù)的輸入流,conn為數(shù)據(jù)庫(kù)連接對(duì)象。
第二步:從數(shù)據(jù)庫(kù)讀取到前端頁(yè)面
(1)在 Java 代碼中從數(shù)據(jù)庫(kù)中讀取圖片數(shù)據(jù),示例代碼如下:
public void getImage(int id, HttpServletResponse response) { try { PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM tb_image WHERE id=?"); pstmt.setInt(1, id); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { String name = rs.getString("name"); Blob imageBlob = rs.getBlob("image"); InputStream is = imageBlob.getBinaryStream(); ServletOutputStream out = response.getOutputStream(); response.setContentType("image/jpeg"); response.setHeader("Content-Disposition", "attachment;filename=" + name); byte[] b = new byte[1024]; int len; while ((len = is.read(b)) > 0) { out.write(b, 0, len); } is.close(); out.flush(); out.close(); } rs.close(); pstmt.close(); } catch (Exception e) { e.printStackTrace(); } }
其中,id 為圖片在數(shù)據(jù)庫(kù)中的對(duì)應(yīng)主鍵,response 為響應(yīng)對(duì)象,conn 為數(shù)據(jù)庫(kù)連接對(duì)象。通過操作 ResultSet 對(duì)象可以得到圖片數(shù)據(jù)的輸入流。
(2)在前端頁(yè)面中調(diào)用此 Java 方法,將圖片數(shù)據(jù)顯示在頁(yè)面上,示例代碼如下:
<img src="/getImage?id=1" />
其中,getImage 方法的 id 參數(shù)表示圖片在數(shù)據(jù)庫(kù)中的主鍵值。在前端頁(yè)面中使用 img 標(biāo)簽,指定 src 屬性為 getImage 方法的 url 地址即可
到此這篇關(guān)于Spring MVC 圖片的上傳和下載的文章就介紹到這了,更多相關(guān)Spring MVC 圖片上傳下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis實(shí)現(xiàn)動(dòng)態(tài)建表代碼實(shí)例
這篇文章主要介紹了Mybatis實(shí)現(xiàn)動(dòng)態(tài)建表代碼實(shí)例,解釋一下,就是指根據(jù)傳入的表名,動(dòng)態(tài)地創(chuàng)建數(shù)據(jù)庫(kù)表,以供后面的業(yè)務(wù)場(chǎng)景使用,2023-10-10
而使用 Mybatis 的動(dòng)態(tài) SQL,就能很好地為我們解決這個(gè)問題,需要的朋友可以參考下Java Spring-Cache key配置注意事項(xiàng)介紹
本文主要對(duì)java spring-cache key配置注意事項(xiàng)進(jìn)行了介紹,小編覺得還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10SpringBoot SSE服務(wù)端主動(dòng)推送事件的實(shí)現(xiàn)
本文主要介紹了SpringBoot SSE服務(wù)端主動(dòng)推送事件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Spring聲明式事務(wù)@Transactional知識(shí)點(diǎn)分享
在本篇文章里小編給大家整理了關(guān)于Spring聲明式事務(wù)@Transactional詳解內(nèi)容,需要的朋友們可以參考下。2020-02-02java項(xiàng)目怎么集成stable diffusion圖文生成算法
在開發(fā)Java項(xiàng)目過程中,我們經(jīng)常需要使用消息傳遞來實(shí)現(xiàn)不同組件之間的通信,Stable Diffusion是一種基于消息傳遞的實(shí)時(shí)通信解決方案,使用Java調(diào)用外部服務(wù)(如Python腳本或API服務(wù)),這些服務(wù)運(yùn)行Stable Diffusion模型,本文將介紹如何將Stable Diffusion集成到Java項(xiàng)目2024-07-07Java分支結(jié)構(gòu)程序設(shè)計(jì)實(shí)例詳解
這篇文章主要介紹了Java分支結(jié)構(gòu)程序設(shè)計(jì)例題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01