目錄
一、文件上傳
1.1 導(dǎo)入依賴
1.2 配置文件上傳解析器
1.3 配置服務(wù)器存放文件地址
1.3.1 點(diǎn)擊編輯Configurations
1.3.2 將項(xiàng)目部署至tomcat服務(wù)器上
1.3.3 配置相對(duì)路徑
1.4?導(dǎo)入PropertiesUtil工具類
1.5?編寫resource.properties
1.6?添加sql
1.7?編寫PageController類
1.8?編寫主頁展示界面
1.9?編寫文件上傳方法
1.10?搭建一個(gè)圖片上傳的操作頁面?
二、文件下載
三、多文件上傳
四、jrebel的使用
4.1 jrebel插件的安裝
4.2 打開代理
4.3?設(shè)置jrebel離線
五、收獲
一、文件上傳
演示代碼基于上篇博客:SpringMVC之CRUDhttps://blog.csdn.net/weixin_74263417/article/details/132763882?spm=1001.2014.3001.5501
我這里的屬性名為jay_music數(shù)據(jù)表的字段如圖? :?
由于我們?cè)谏掀呀?jīng)生成了帶圖片屬性的接口、實(shí)體以及配置文件。所以我們就不需要重新逆向生成mapper和model包中的代碼了。
1.1 導(dǎo)入依賴
導(dǎo)入依賴:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
1.2 配置文件上傳解析器
在spring-mvc.xml中配置文件上傳解析器,代碼如下:
<!-- 處理文件上傳下載問題-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 必須和用戶JSP 的pageEncoding屬性一致,以便正確解析表單的內(nèi)容 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 文件最大大小(字節(jié)) 1024*1024*50=50M-->
<property name="maxUploadSize" value="52428800"></property>
<!--resolveLazily屬性啟用是為了推遲文件解析,以便捕獲文件大小異常-->
<property name="resolveLazily" value="true"/>
</bean>
CommonsMultipartResolver是MultipartResolver接口的實(shí)現(xiàn)類。?
1.3 配置服務(wù)器存放文件地址
具體操作如下:
1.3.1 點(diǎn)擊編輯Configurations
1.3.2 將項(xiàng)目部署至tomcat服務(wù)器上
1.3.3 配置相對(duì)路徑
注:本地路徑名需與resource.properties資源文件中路徑保持一致。?
然后保存好即可。
1.4?導(dǎo)入PropertiesUtil工具類
package com.Kissship.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesUtil {
public static String getValue(String key) throws IOException {
Properties p = new Properties();
InputStream in = PropertiesUtil.class.getResourceAsStream("/resource.properties");
p.load(in);
return p.getProperty(key);
}
}
1.5?編寫resource.properties
創(chuàng)建一個(gè)名為resource.properties的資源文件,如下:
dir=D:/temp/upload/
server=/upload/
dir作為上傳圖片的真實(shí)地址,而server即是網(wǎng)絡(luò)訪問地址。?
1.6?添加sql
在逆向生成后的musicmapper.xml中加入以下代碼:
<select id="listPager" resultType="com.Kissship.model.Music" parameterType="com.Kissship.model.Music" >
select
*
from jay_music
<where>
<if test="mname != null">
and mname like concat('%',#{mname},'%')
</if>
</where>
</select>
緊接著在自動(dòng)生成的mapper類中加入以下代碼:
List<Music> listPager(Music music);
1.7?編寫PageController類
然后再創(chuàng)建一個(gè)公共路徑處理類 PageController類,代碼如下:
package com.Kissship.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Kissship
* @site www.Kissship.com
* @company xxx公司
* @create 2023-09-07-15:01
*
* 用來處理頁面跳轉(zhuǎn)
*/
@Controller
public class PageController {
//<a href="order/preSave">新增</a> 新增界面
@RequestMapping("/page/{page}")
public String toPage(@PathVariable("page") String page){
return page;
}
@RequestMapping("/page/{dir}/{page}")
public String toDirPage(@PathVariable("dir") String dir,
@PathVariable("page") String page){
return dir + "/" + page;
}
}
?1.8?編寫主頁展示界面
主頁代碼 list.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link
rel="stylesheet">
<script
src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<title>JayChou歌單列表</title>
<style type="text/css">
.page-item input {
padding: 0;
width: 40px;
height: 100%;
text-align: center;
margin: 0 6px;
}
.page-item input, .page-item b {
line-height: 38px;
float: left;
font-weight: 400;
}
.page-item.go-input {
margin: 0 10px;
}
</style>
</head>
<body>
<form class="form-inline"
action="${pageContext.request.contextPath }/mic/list" method="post">
<div class="form-group mb-2">
<input type="text" class="form-control-plaintext" name="mname"
placeholder="請(qǐng)輸入歌曲名稱">
<!-- <input name="rows" value="20" type="hidden"> -->
<!-- 不想分頁 -->
<%-- <input name="pagination" value="false" type="hidden">--%>
</div>
<button type="submit" class="btn btn-primary mb-2">查詢</button>
<a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/mic/preSave">新增</a>
</form>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">歌曲編號(hào)</th>
<th scope="col">歌曲名稱</th>
<th scope="col">歌曲專輯</th>
<th scope="col">歌曲歌詞</th>
<th scope="col">歌曲圖片</th>
</tr>
</thead>
<tbody>
<c:forEach var="b" items="${lst }">
<tr>
<td>${b.mid }</td>
<td>${b.mname }</td>
<td>${b.mtype }</td>
<td>${b.minfo }</td>
<td>
<img src="${b.mpic }" style="height: 60px;width: 60px">
</td>
<td>
<a href="${pageContext.request.contextPath }/mic/preSave?mid=${b.mid}">修改</a>
<a href="${pageContext.request.contextPath }/mic/del/${b.mid}">刪除</a>
<a href="${pageContext.request.contextPath }/page/mic/upload?mid=${b.mid}">圖片上傳</a>
<a href="${pageContext.request.contextPath }/mic/download?mid=${b.mid}">圖片下載</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- 這一行代碼就相當(dāng)于前面分頁需求前端的幾十行了 -->
<z:page pageBean="${pageBean }"></z:page>
${pageBean }
</body>
</html>
1.9?編寫文件上傳方法
在我們的MusicController控制器中增加文件上傳的方法進(jìn)行配置,要增加的代碼如下:
//文件上傳
@RequestMapping("/upload")
public String upload(Music music,MultipartFile m){
try {
// 3.后端可以直接利用mutipartFile類,接受前端傳遞到后臺(tái)的文件
//上傳的圖片真實(shí)存放地址
String dir = PropertiesUtil.getValue("dir");
//網(wǎng)絡(luò)訪問地址
String server = PropertiesUtil.getValue("server");
String fileName = m.getOriginalFilename();
System.out.println("文件名:"+fileName);
System.out.println("文件類別:"+m.getContentType());
//4.將文件轉(zhuǎn)成流,然后寫入服務(wù)器(某一個(gè)硬盤)
FileUtils.copyInputStreamToFile(m.getInputStream(),new File(dir+fileName));
music.setMpic(server+fileName);
musicBiz.updateByPrimaryKeySelective(music);
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:list";
}
1.10?搭建一個(gè)圖片上傳的操作頁面?
創(chuàng)建一個(gè)新的upload.jsp頁面作為圖片上傳操作頁面,upload.jsp代碼如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>專輯圖片上傳</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/mic/upload" method="post" enctype="multipart/form-data">
<label>歌曲編號(hào):</label><input type="text" name="mid" readonly="readonly" value="${param.mid}"/><br/>
<label>專輯圖片:</label><input type="file" name="m"/><br/>
<input type="submit" value="上傳圖片"/>
</form>
<form method="post" action="${pageContext.request.contextPath}/mic/uploads" enctype="multipart/form-data">
<input type="file" name="files" multiple>
<button type="submit">上傳</button>
</form>
</body>
</html>
然后啟動(dòng)tomcat服務(wù)器訪問路徑進(jìn)行測(cè)試,測(cè)試結(jié)果如下:
二、文件下載
在Controller層中加入以下代碼,如下:
//文件下載實(shí)現(xiàn)
@RequestMapping(value="/download")
public ResponseEntity<byte[]> download(Music music,HttpServletRequest req){
try {
//先根據(jù)文件id查詢對(duì)應(yīng)圖片信息
Music mic = this.musicBiz.selectByPrimaryKey(music.getMid());
String diskPath = PropertiesUtil.getValue("dir");
String reqPath = PropertiesUtil.getValue("server");
String realPath = mic.getMpic().replace(reqPath,diskPath);
String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
//下載關(guān)鍵代碼
File file=new File(realPath);
HttpHeaders headers = new HttpHeaders();//http頭信息
String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//設(shè)置編碼
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//MediaType:互聯(lián)網(wǎng)媒介類型 contentType:具體請(qǐng)求中的媒體類型信息
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
}catch (Exception e){
e.printStackTrace();
}
return null;
之后重啟tomcat服務(wù)器進(jìn)行測(cè)試,結(jié)果如下:
三、多文件上傳
多文件上傳和普通文件上傳的區(qū)別:
- 參數(shù)類型不同:多文件上傳使用MultipartFile[]作為參數(shù)類型,而普通文件上傳使用MultipartFile作為參數(shù)類型。
- 前端表單處理不同:多文件上傳需要使用input[type=“file”]的multiple屬性,并選擇多個(gè)文件進(jìn)行上傳,而普通文件上傳只能選擇單個(gè)文件上傳。
- 后端處理方式不同:多文件上傳需要接收文件數(shù)組,可以對(duì)每個(gè)文件進(jìn)行處理;普通文件上傳只能接收單個(gè)文件。
在Controller層中加入以下代碼,如下:
//多文件上傳
@RequestMapping("/uploads")
public String uploads(HttpServletRequest req, Music music, MultipartFile[] files){
try {
StringBuffer sb = new StringBuffer();
for (MultipartFile cfile : files) {
//思路:
//1) 將上傳圖片保存到服務(wù)器中的指定位置
String dir = PropertiesUtil.getValue("dir");
String server = PropertiesUtil.getValue("server");
String filename = cfile.getOriginalFilename();
FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
sb.append(filename).append(",");
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
return "redirect:list";
}
?增加完后重啟tomcat服務(wù)器進(jìn)行測(cè)試,測(cè)試結(jié)果如下:
四、jrebel的使用
使用 JRebel 啟動(dòng)項(xiàng)目有以下好處:
快速部署:JRebel 允許在應(yīng)用程序運(yùn)行時(shí)熱部署代碼和資源文件,而無需重新啟動(dòng)整個(gè)應(yīng)用程序。這大大提高了開發(fā)效率,省去了傳統(tǒng)的重啟應(yīng)用程序的時(shí)間。
即時(shí)生效:JRebel 對(duì)于大部分代碼和資源的修改,都能夠?qū)崟r(shí)生效,無須手動(dòng)重新編譯和重新部署。這使得開發(fā)人員能夠立即看到他們所做的更改的效果,快速迭代開發(fā)。
保持應(yīng)用狀態(tài):JRebel 可以保持應(yīng)用程序的狀態(tài),包括各種已經(jīng)加載的類、對(duì)象、變量等。這意味著在代碼修改后,應(yīng)用程序的狀態(tài)仍然可以保持不變,不會(huì)丟失用戶的登錄狀態(tài)、緩存數(shù)據(jù)等。
支持多種框架和技術(shù)棧:JRebel 不僅適用于 Java SE 和 Java EE 應(yīng)用程序,還支持許多主流的框架和技術(shù)棧,如Spring、Hibernate、Maven、Gradle等。這使得 JRebel 能夠應(yīng)用于各種類型的項(xiàng)目。
減少開發(fā)周期:由于 JRebel 的快速部署和即時(shí)生效特性,開發(fā)人員可以迅速驗(yàn)證和修改他們的代碼,減少了開發(fā)周期。這有助于提高團(tuán)隊(duì)的開發(fā)效率和項(xiàng)目的交付速度。
4.1 jrebel插件的安裝
重啟后的IDEA是這樣的:
但是此時(shí)我們還需要打開代理(黑窗口)才可以用jrebel啟動(dòng)項(xiàng)目。如下:
4.2 打開代理
下載代理,進(jìn)行jrebel的使用:
4.3?設(shè)置jrebel離線
打開代理后點(diǎn)擊jrebel啟動(dòng)項(xiàng)目,會(huì)彈出以下窗口,具體操作如下:
1.在彈出框中Team URL下方第一個(gè)輸入框輸入:
?http://127.0.0.1:8888/0e63ac70-2074-46d3-9de1-46fb2befde0a
2.在第二個(gè)輸入框輸入自己的郵箱。
3.勾選 I agree with the term...
4.最后點(diǎn)擊最下方按鈕Activete JRebel即可。
設(shè)置完jrebel離線之后,在用jrebel插件啟動(dòng)項(xiàng)目之前就可以不打開代理輔助工具了。
五、收獲
學(xué)習(xí) Spring MVC 文件上傳與下載可以給我們帶來以下收獲:
擴(kuò)展技能:掌握 Spring MVC 文件上傳與下載技術(shù),可以擴(kuò)展你的技能范圍。這使得你成為一個(gè)更全面的開發(fā)人員,可以處理包括文件上傳與下載在內(nèi)的更廣泛的任務(wù)。
實(shí)現(xiàn)功能需求:文件上傳與下載是許多 Web 應(yīng)用程序常見的功能需求。通過學(xué)習(xí) Spring MVC 文件上傳與下載,你可以滿足項(xiàng)目或產(chǎn)品的要求,將其集成到你的應(yīng)用程序中,讓用戶能夠上傳和下載文件。
提升用戶體驗(yàn):文件上傳與下載功能可以提升用戶體驗(yàn),使用戶能夠方便地上傳所需的文件或下載所需的資源。這對(duì)于許多應(yīng)用程序來說是重要的功能特性,可以提高用戶的滿意度和使用度。
理解文件操作原理:學(xué)習(xí)文件上傳與下載的實(shí)現(xiàn)原理可以讓你更深入地理解文件操作的相關(guān)概念和技術(shù)。你可以了解如何處理文件的輸入輸出、如何管理文件的存儲(chǔ)和訪問,以及如何在應(yīng)用程序中保護(hù)文件的安全性。
強(qiáng)化項(xiàng)目開發(fā)能力:掌握文件上傳與下載技術(shù)可以強(qiáng)化你的項(xiàng)目開發(fā)能力。你可以更好地處理文件相關(guān)的需求,比如批量文件上傳、大文件上傳、文件分片上傳等,提高開發(fā)效率和代碼質(zhì)量。
解決實(shí)際問題:學(xué)習(xí)文件上傳與下載技術(shù)可以幫助你解決實(shí)際的問題和挑戰(zhàn)。你可以應(yīng)對(duì)各種情況,如文件大小限制、文件類型驗(yàn)證、安全性控制等,確保文件操作的可靠性和穩(wěn)定性。
最后SpringMVC之文件上傳下載以及jrebel的使用就到這里,祝大家在敲代碼的路上一路通暢!
感謝大家的觀看 !文章來源:http://www.zghlxwxcb.cn/news/detail-705688.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-705688.html
到了這里,關(guān)于SpringMVC之文件上傳下載以及jrebel的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!