这是在原来的spring+springmvc+mybatis项目基础上加的文件上传与下载,如果有不懂spring+springmvc+mybatis框架集成的也可以点击这里.查看。
单文件上传
在spring-mvc中配置文件上传的解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
编写Controller层
//文件上传
@RequestMapping("upload")
public ModelAndView uploadFile(MultipartFile uploadFile,HttpSession session){
//获取上传文件名
String filename = uploadFile.getOriginalFilename();
//获取webapp下的img文件夹的绝对路径作为前半部分路径
String Path = session.getServletContext().getRealPath("/img");
//将文件的前半部分路径与文件名拼接
File file = new File(Path, filename);
try {
uploadFile.transferTo(file);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
ModelAndView mv = new ModelAndView();
mv.setViewName("jsp/index2");
mv.addObject("img", filename);//为了前台展示需要文件名
return mv;
}
//文件下载
@RequestMapping (value = "/download")
public void download(HttpServletRequest request, HttpServletResponse response, @Param ("filename") String filename) throws IOException {
//设置响应流中文件进行下载
response.setHeader("Content-Disposition", "attachment;filename" + filename);
//把二进制流放入到响应体中
ServletOutputStream os = response.getOutputStream();
//获取文件路径
String path = request.getSession().getServletContext().getRealPath("/img");
File file = new File(path, filename);
byte[] bytes = FileUtils.readFileToByteArray(file);
os.write(bytes);
os.flush();
os.close();
}
网页代码:
到这里单文件上传就已经完成了,下面就是最后效果
多文件上传
多文件上传即在原本上传的基础上,将传入参数MultipartFile uploadFile修改为MultipartFile[] uploadFile数组形式,在上传时就可以遍历这个数组来完成多文件上传
@RequestMapping("upload")
public ModelAndView uploadFile(MultipartFile[] uploadFile,HttpSession session){
//获取上传文件名
for (int i = 0; i < uploadFile.length; i++) {
String filename = uploadFile[i].getOriginalFilename();
//获取WebRoot下的images文件夹的绝对路径作为前半部分路径
String leftPath = session.getServletContext().getRealPath("/images");
//将文件的前半部分路径与文件名拼接
File file = new File(leftPath, filename);
try {
uploadFile[i].transferTo(file);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
jsp页面
<form action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">
<h2>文件上传</h2>
文件1:<input type="file" name="uploadFile"/><br/>
文件2:<input type="file" name="uploadFile"/><br/>
文件3:<input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
以上是基于form表单的上单,下面来给大家介绍用ajax的方式来上传图片
MultipartFile+ajax图片上传
网页代码
<form id="uploadForm">
<input type="file" name="uploadFile" class="file">
<input type="button" class="save" value="保存">
</form>
js代码
$(".save").click(function () {
var file = $('.file')[0].files[0];
var formData = new FormData();
formData.append("file_data", file);
$.ajax({
url: url,//请求路径
type: 'POST',
cache: false,
data: formData,
processData: false,
contentType: false,
success/error方法省略
});
controller层
跟上面的controller一样,只是在 MultipartFile uploadFile前面加个@RequestParam (“file_data”)
注意 :
一定要在SpringMVC的xml文件中配置上传解析器,否则会报错
Unable to process parts as no multi-part configuration has been provided,
即无法处理部件,因为未提供多部件配置
个人心得: 在做图片上传下载的功能板块的时候,主要是通过MultipartFile和IO流等来返回上传图片的名称,再利用img标签来实现展示图片和通过图片名下载图片。