Spring MVC 圖片的上傳和下載功能

序言
SSM 框架是一種基于Java的Web開(kāi)發(fā)框架,其中Spring作為控制層、SpringMVC作為視圖層、MyBatis作為持久層,這個(gè)框架非常適合Web應(yīng)用程序的開(kāi)發(fā)。在這篇文章中,我們將使用 SSM 框架來(lái)實(shí)現(xiàn)圖片的上傳和下載功能。
首先,我們需要準(zhǔn)備好一個(gè)基本的SSM框架環(huán)境,也就是需要一個(gè)Tomcat服務(wù)器、Spring、SpringMVC和MyBatis等開(kāi)發(fā)工具。
接著創(chuàng)建一個(gè)名為Image的Java類(lèi)來(lái)存儲(chǔ)圖片的信息。該類(lèi)包含以下字段:id、name、path、size、createTime、type、等。
思路一:瀏覽器圖片的上傳下載顯示通過(guò)本地實(shí)現(xiàn)
下面我們來(lái)實(shí)現(xiàn)具體的功能:
1、圖片上傳功能
在控制層中,我們創(chuàng)建一個(gè)名為UploadController的類(lèi)來(lái)處理上傳請(qǐng)求。在該類(lèi)中,我們需要添加一個(gè)方法,該方法用于處理上傳請(qǐng)求并返回上傳結(jié)果。在該方法中,我們需要使用SpringMVC提供的 MultipartResolver 類(lèi)來(lái)解析上傳的文件,獲取文件信息,并將文件保存到服務(wù)器上。以下是UploadController類(lèi)中的代碼:
@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的類(lèi)來(lái)處理下載請(qǐng)求。在該類(lèi)中,我們需要添加一個(gè)方法,該方法用于處理下載請(qǐng)求并返回下載結(jié)果。在該方法中,我們需要使用SpringMVC提供的 ResponseEntity 類(lèi)來(lái)返回文件流并設(shè)置相關(guān)的頭信息。以下是DownloadController類(lèi)中的代碼:
@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) 方法來(lái)獲取要下載的圖片的信息,這個(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)。通過(guò)SSM框架的整合,我們可以很方便地實(shí)現(xiàn)文件上傳和下載的功能。
。
思路二:瀏覽器圖片的上傳下載顯示通過(guò)數(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ì)象。通過(guò)操作 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)文章
IDEA集成git和使用步驟的實(shí)現(xiàn)方法
這篇文章主要介紹了IDEA集成git和使用步驟的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Spring Security和自定義filter的沖突導(dǎo)致多執(zhí)行的解決方案
這篇文章主要介紹了Spring Security和自定義filter的沖突導(dǎo)致多執(zhí)行的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java錯(cuò)誤org.apache.ibatis.binding.BindingException: Inval
本文主要介紹了Java錯(cuò)誤org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.sjks.mapper.Use,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Spring Boot結(jié)成MyBatis-Plus最全配置指南
本文主要介紹了Spring Boot結(jié)成MyBatis-Plus最全配置指南,包括依賴引入、配置數(shù)據(jù)源、Mapper 掃描、基本CRUD操作等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
編寫(xiě)Java代碼對(duì)HDFS進(jìn)行增刪改查操作代碼實(shí)例
這篇文章主要介紹了Java代碼對(duì)HDFS進(jìn)行增刪改查操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
IntellJ IDEA JAVA代碼任務(wù)標(biāo)記實(shí)例解析
這篇文章主要介紹了IntellJ IDEA JAVA代碼任務(wù)標(biāo)記實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Mybatis之@ResultMap,@Results,@Result注解的使用
這篇文章主要介紹了Mybatis之@ResultMap,@Results,@Result注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

