commons-fileupload
commons-fileupload
1.3.3
在spring-mvc.xml文件中添加文件上传解析器。
CommonsMultipartResolver是MultipartResolver接口的实现类。
MultipartResolver是用于处理文件上传,当收到请求时DispatcherServlet的checkMultipart()方法会调用MultipartResolver的isMultipart()方法判断请求中是否包含文件,如果请求数据中包含文件,则调用MultipartResolver的resolverMultipart()方法对请求的数据进行解析,然后将文件数据解析MultipartFile并封装在MultipartHTTPServletRequest(继承了HTTPServletRequest)对象中,最后传递给Controller。
1.通过PropertiesUtil工具类加载配置页目录文件
package com.YU.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);
}
}
2.同时在代码中我们可以发现,通过工具类读取resource.properties文件,在配置文件resource.properties中,我们将一些服务器存放文件地址定义在该文件中,方便我们后期修改配置文件
3.resource.properties文件
dir = D:/deposit/upload/
server = /upload/
通过Controller层利用MultipartFile类接收前端传递的文件到后台,以流的方式上传到服务器中,
并将数据库中数据的字段(图片路径)进行修改
//文件上传
@RequestMapping("/upload")
public String upload(HBook hBook,MultipartFile bfile){
try {
String dir = PropertiesUtil.getValue("dir");
String server = PropertiesUtil.getValue("server");
String filename = bfile.getOriginalFilename();
FileUtils.copyInputStreamToFile(bfile.getInputStream(), new File(dir + filename));
hBook.setImg(server+filename);
hBookbiz.updateByPrimaryKeySelective(hBook);
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:list";
}
编写前端页面表单,通过post请求的方式将图片上传到服务器,并将数据进行修改
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
图片上传
注意:表单的提交方式为
enctype="multipart/form-data"
,它是一个HTML表单属性,用于指定将表单数据编码为多部分(multipart)的格式,以便支持文件上传,文件上传需要额外的服务器端处理逻辑,包括文件存储、验证、处理等。在服务器端代码中,需要根据我们的需求来处理上传的文件
我们在将数据传输到服务器时,可以通过查看服务器部署的地址查看我们传输的文件
我们通过controller层调用请求方法,获取到服务器本地请求地址,并将网络请求地址替换成本地,截取当前名称进行+1作为下载名称,再获取请求头信息,以二进制流的形式进行转换,并通过
ResponseEntity
将文件内容以字节数组的形式作为响应主体返回给客户端
@RequestMapping(value="/download")
public ResponseEntity download(HBook hBook, HttpServletRequest req){
try {
//先根据文件id查询对应图片信息
HBook clz = this.hBookbiz.selectByPrimaryKey(hBook.getBid());
String diskPath = PropertiesUtil.getValue("dir");
String reqPath = PropertiesUtil.getValue("server");
String realPath = clz.getImg().replace(reqPath,diskPath);
String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
//下载关键代码
File file=new File(realPath);
HttpHeaders headers = new HttpHeaders();//http头信息
String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
headers.setContentDispositionFormData("attachment", downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//MediaType:互联网媒介类型 contentType:具体请求中的媒体类型信息
return new ResponseEntity(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
}catch (Exception e){
e.printStackTrace();
}
return null;
}
多文件上传和普通文件上传的区别在于form表单提交的参数不同和controller层的上传形式不同
获取上传文件的原始文件名:String filename = cfile.getOriginalFilename();
根据配置文件中指定的服务器目录保存上传文件:FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
这里使用了 FileUtils
工具类将文件内容复制到指定的服务器目录中。
将文件名追加到 sb
对象中:sb.append(filename).append(",");
最后,将 sb.toString()
输出到控制台。
如果有任何异常发生,将打印异常栈轨迹。
最后,方法返回 "redirect:list"
,将客户端重定向到名为 list
的页面。
@RequestMapping("/uploads")
public String uploads(HttpServletRequest req, HBook hBook, MultipartFile[] files){
try {
StringBuffer sb = new StringBuffer();
for (MultipartFile cfile : files) {
//思路:
//1) 将上传图片保存到服务器中的指定位置
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";
}
本期文件下载到这里就结束了,感谢各位大大的观看,三连是博主更新的动力,感谢谢谢谢谢!!!!