SpringMVC文件上传和下载
基于表单的文件上传
标签 <input type="file"/>
会在浏览器中显示一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。
文件上传的表单例子如下:
<form method="post" action="upload" enctype="multipart/form-data">
<input type="file" name="myfile"/>
</form>
对于form三个参数介绍:
- action 信息送的目的地(后台数据接受与处理模块:一般处理程序)
- post 隐式发送 get显示发送
- enctype="multiparta/form-data 只要表单有文件上传就这样固定写 流的形式
部分需要注意的代码:
1.转格式 还原成8859格式
String newName= new String(fileName.getBytes("UTF-8"),"iso-8859-1");
2 转流
HttpHeaders hh=new HttpHeaders();
// 头部上下文表单里的数据 参数一固定值 参数二转流后新名字
hh.setContentDispositionFormData("attachment",newName);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),hh,HttpStatus.CREATED);
注意:参数一为固定值 参数二为转流后新名字
3 获得上传文件名
String name=file[i].getOriginalFilename();
4修改文件名
String newName=new Date().getTime()+new Random().nextInt(9999999)+name;
File file1=new File(realPath+newName);
注意:获取毫秒级数据+随机数+name 得到唯一名 防止重名发生
代码实例:
1.UploadController
package cn.zjw.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Random;
@Controller
public class UploadController{
@RequestMapping("/upload.do")
public String upload(MultipartFile file[],HttpServletRequest request) throws IOException {
for (int i = 0; i<file.length; i++) {
// 上传路径
String realPath=request.getServletContext().getRealPath("/upload/");//上传文件都在upload里
// 获得上传文件名
String name=file[i].getOriginalFilename();
// 修改文件名
String newName=new Date().getTime()+new Random().nextInt(9999999)+name;
File file1=new File(realPath+newName);
// 上传
file[i].transferTo(file1);
}
return "success";
}
}
2.upload.jsp
<html>
<head>
<title>上传文件</title>
</head>
<body>
<%--action 信息送的目的地(后台数据接受与处理模块:一般处理程序)--%>
<%--post 隐式发送 get显示发送--%>
<%--enctype="multiparta/form-data 只要表单有文件上传就这样固定写 流的形式--%>
<form action="upload.do" method="post" enctype="multipart/form-data">
上传文件<input type="file" name="file"><br>
上传文件<input type="file" name="file"><br>
上传文件<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
3DownloadController
package cn.zjw.controller;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@Controller
public class DownloadController {
@RequestMapping("/download.do")
public ResponseEntity<byte[]> download(@RequestParam("fileName") String fileName,HttpServletRequest request) throws IOException {
// 获得下载路径
String realpath = request.getServletContext().getRealPath("/download/");
File file=new File(realpath+fileName);
// 转格式 还原成8859格式
String newName= new String(fileName.getBytes("UTF-8"),"iso-8859-1");
// 转流
HttpHeaders hh=new HttpHeaders();
// 头部上下文表单里的数据 参数一固定值 参数二转流后新名字
hh.setContentDispositionFormData("attachment",newName);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),hh,HttpStatus.CREATED);
}
}
4 download.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<a href="download/2.jpg">下载文档</a>--%>
<a href="download.do?fileName=2.jpg">下载文档pic</a>
</body>
</html>
运行结果: 成功上传下载2.jpg图片
上传结果图:
下载结果图: