这里写目录标题
- 一、文件上传步骤
- 1、创建jsp页面
- 2、创建控制器类
- 3、在springmvc配置文件中定义图片上传的bean对象
- 4、在tomcat的webapps目录下创建存放图片上传的文件夹
- 5、在控制器类中创建jsp页面Post提交方式的对应处理方法
- 6、在jsp页面中通过< img >标签来显示webapps文件目录下的图片
- 7、通过request对象来获取webapps目录,使得代码更加灵活
- 8、因为上传的图片格式和文件名不可能都是一样,所以代码做如下改进
- 9、当jsp页面中没有点击上传图片时,则会报错,因为并没有判断上传图片是否为空
- 10、在实际开发中不可能特意跑去tomcat目录下的webapps文件夹下再创建一个专门存放图片的子文件夹
- 11、完整代码:
- 二、文件下载
- 三、多文件上传
- 四、如何将以上代码运用到项目中去呢?
一、文件上传步骤
1、创建jsp页面
2、创建控制器类
1、这里定义了浏览器中访问的路径为http://localhost:8080/smv/up
2、并在springmvc配置文件中定义了视图解析器
3、在springmvc配置文件中定义图片上传的bean对象
4、在tomcat的webapps目录下创建存放图片上传的文件夹
5、在控制器类中创建jsp页面Post提交方式的对应处理方法
修改:里面的路径修改为D:\Tomcat9\tomcat9.0\webapps\imgs\7.jpg
6、在jsp页面中通过< img >标签来显示webapps文件目录下的图片
7、通过request对象来获取webapps目录,使得代码更加灵活
8、因为上传的图片格式和文件名不可能都是一样,所以代码做如下改进
9、当jsp页面中没有点击上传图片时,则会报错,因为并没有判断上传图片是否为空
10、在实际开发中不可能特意跑去tomcat目录下的webapps文件夹下再创建一个专门存放图片的子文件夹
11、完整代码:
项目的目录结构图:
UploadController.java
@Controller
public class UploadController {
@RequestMapping(value = "/up",method = RequestMethod.GET)
public String uploadFile(){
return "upload";
}
@RequestMapping(value = "/up",method = RequestMethod.POST)
public String uploadFile(@RequestParam(value = "file",required = false)MultipartFile file
, HttpServletRequest request, ModelMap model) throws IOException {
String webapps = null;
String fileName = null;
if (!file.isEmpty()) {
String realPath = request.getServletContext().getRealPath("/");
System.out.println("工程目录:"+realPath);//工程目录:D:\Tomcat9\tomcat9.0\webapps\uploadFile\
webapps = new File(realPath).getParent();
System.out.println("webapps目录:"+webapps);//D:\Tomcat9\tomcat9.0\webapps
//将文件名最后一个'.'的位置开始裁剪,把文件后缀名裁剪出来
String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
System.out.println("图片后缀名:" + ext);
//图片名
fileName = file.getOriginalFilename();
System.out.println("图片名:"+ fileName);
//产生随机图片名
//String imgname = UUID.randomUUID().toString()+".jpg";
String imgname = UUID.randomUUID().toString() + ext;
//先判断/imgs/文件是否存在,没有则自动创建/imgs/文件夹
if (new File(webapps+"/imgs/").exists() == false){
new File(webapps+"/imgs/").mkdirs();
}
file.transferTo(new File(webapps + "\\imgs\\" + imgname));
}
model.put("fileUrl",webapps+"/imgs/"+ fileName);
model.put("fileName",fileName);
return "show";
}
}
upload.jsp
<form action="/uploadFile/up" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="file"><br/><br/>
<input type="submit" value="上传"><br/>
</form>
show.jsp
<body>
文件上传成功!<br>
上传文件的路径:${requestScope.fileUrl}<br>
<a href="fileDownload?fileName=${requestScope.fileName}">${requestScope.fileName }</a>
</body>
springmvc.xml
<mvc:annotation-driven/>
<!-- 配置自动扫描的基包 -->
<context:component-scan base-package="com.hcz.controller"/>
<!-- 配置视图解析器,将控制器方法返回的逻辑视图解析为物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- <property name="prefix" value="/ch06/"></property> -->
<property name="prefix" value="/WEB-INF/show/" />
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件的最大尺寸为10MB -->
<property name="maxUploadSize" value="10485760"/>
<!-- 字符编码 -->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
web.xml
<!-- 配置Spring MVC的前端控制器DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数,配置Spring MVC配置文件的位置以及名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 表示容器启动时,立即加载dispatcherServlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Spring MVC的前端控制器拦截所有的请求 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
二、文件下载
只需在控制器类中添加以下方法即可
/**
* 文件下载
*/
@RequestMapping(value="/fileDownload")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
@RequestParam("fileName") String fileName) throws Exception {
//下载文件路径
String realPath = request.getServletContext().getRealPath("/");
System.out.println("工程目录:"+realPath);
String webapps = new File(realPath).getParent();
//创建文件对象
File file=new File(webapps + "//imgs//" +fileName);
//设置相应头
HttpHeaders headers=new HttpHeaders();
//下载显示的文件名,解决中文名乱码问题
String downloadFileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
//通知浏览器以下载方式(attachment)打开文件
headers.setContentDispositionFormData("attachment", downloadFileName);
//定义以二进制流的形式下载返回的文件数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//使用Spring MVC框架的ResponseEntity对象封装返回下载的数据
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
三、多文件上传
控制器类:UploadController . java
@Controller
public class UploadController {
@RequestMapping(value = "/up",method = RequestMethod.GET)
public String uploadFile(){
return "upload";
}
@RequestMapping(value = "/up",method = RequestMethod.POST)
public String uploadFile(@RequestParam("description") String description,
@RequestParam(value = "files",required = false) List<MultipartFile> files
, HttpServletRequest request) throws IOException {
String webapps = null;
String fileName = null;
if (!files.isEmpty()&&files.size()>0) {
//循环输出上传的文件
for (MultipartFile file : files){
String realPath = request.getServletContext().getRealPath("/");
System.out.println("工程目录:"+realPath);
webapps = new File(realPath).getParent();
System.out.println("webapps目录:"+webapps);//D:\Tomcat9\tomcat9.0\webapps
//将文件名最后一个'.'的位置开始裁剪,把文件后缀名裁剪出来
String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
System.out.println("图片后缀名:" + ext);
//图片名
fileName = file.getOriginalFilename();
System.out.println("图片名:"+ fileName);
//产生随机图片名
//String imgname = UUID.randomUUID().toString()+".jpg";
String imgname = description + "_" +UUID.randomUUID().toString() + ext;
//先判断/imgs/文件是否存在,没有则自动创建/imgs/文件夹
if (new File(webapps+"/imgs/").exists() == false){
new File(webapps+"/imgs/").mkdirs();
}
file.transferTo(new File(webapps + "\\imgs\\" + imgname));
}
return "show";
}
return "error";
}
}
upload.jsp
<body>
<form action="/uploadMultipleFiles/up" method="post" enctype="multipart/form-data">
文件描述:<input type="text" name="description"><br/><br/>
选择文件:<input type="file" name="files" multiple="multiple"><br/><br/>
<input type="submit" value="上传"><br/>
</form>
</body>
error.jsp
<body>
上传错误,请重新上传<br>
<a href="/uploadMultipleFiles/up">返回上传页面</a>
</body>
四、如何将以上代码运用到项目中去呢?
1、在实际项目中需要用到上传图片功能的代码中传入MultipartFile、HttpServletRequest参数,并添加以下代码
2、为方便下面代码调用图片名参数,可将其提到 if 语句上面去定义
3、在jsp页面form表单中需要加入以下代码
4、在jsp页面中定义的参数要和处理该页面的方法传入的参数要一致
注意: 以下代码前面可能一开始定义的文件名和后面的不一致,但是以后面定义的参数名为主