controll代码
@RequestMapping("/upload")
@ResponseBody
//@RequestParam("file") 当html文件标签name和controll参数不一致的时候使用
//List<MultipartFile>是多个文件 单个文件上传可以用MultipartFile对象 也可以用对个文件那个 看你着自己的业务了
public String uploadFile(@RequestParam("file") List<MultipartFile> fileList) throws Exception{
//HttpServletRequest可以使用,这里当然也可以,但是多了一行代码 -、-
//List<MultipartFile> fileList=((MultipartHttpServletRequest)request).getFiles("file");
//循环文件集合
for (MultipartFile multipartFile:fileList) {
//判断是否为空
if(!multipartFile.isEmpty()){
//创建时间格式化对象
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMddHHmmss");
//用于文件名称
String fileName=dateFormat.format(new Date());
//不习惯用这个两个都是用于文件名称
//String fileName=UUID.randomUUID();
//获取上传文件原始名称
String name=multipartFile.getOriginalFilename();
//获取文件后缀
String suffix=name.substring(name.lastIndexOf("."),name.length());
//文件保存路径
String savePath="/home/lazyer/Desktop/";
//生成文件
File file=new File(savePath+fileName+suffix);
//把文件内容写入到file(也就是我们上面创建的文件中)
multipartFile.transferTo(file);
}
}
return "上传成功";
}
@RequestMapping("/download")
public void download(HttpServletResponse response) throws IOException {
//文件路径 一般是数据库存的地址 我没有连接数据库 理解就行了
File file=new File("/home/lazyer/Desktop/a.txt");
//创建文件输入流(读取文件4)
FileInputStream fileInputStream=new FileInputStream(file);
//设置头部信息 设置内容为二进制内容
response.setHeader("content-type","application/octet-stream");
response.setContentType("application/octet-stream");
//告诉浏览器 激活浏览器下载对话框 并将filename加入到对话框中
response.setHeader("Content-Disposition", "attachment;filename="+“a.txt”); //这里的filename是下载之后的名称
//搬运容器 一次搬运多少字节 这里为1k
byte[]buff=new byte[1024];
//创建输入缓存区
BufferedInputStream bis=null;
//创建输出流
OutputStream os=null;
//获取响应对象的输出流
os=response.getOutputStream();
//实例化缓存区对象
bis=new BufferedInputStream(fileInputStream);
//获取读取内容的长度 而不是buff长度
int i=bis.read(buff);
System.out.println(i);
//循环获取文件内容知道全部获取位置
while (i!=-1){
//这里不要纠结他是怎么标记上一次的位置 我也不太懂,好像是有一个 mark()方法作为标记
os.write(buff,0,buff.length);
//写完之后 刷新一下输出流(相当于管道输送液体 第一次输送之后进行清洗,之后也是如此)
os.flush();
i=bis.read(buff);
}
//这里我没有选择自己手动关闭,网上好像说浏览器好像会判断你是否关闭如果没有浏览器会帮你关闭
//建议还是自己手动关闭一下,我是不想打字了
}
//和上面功能一样 自己选
@RequestMapping("/downloads")
public ResponseEntity<InputStreamResource> downloadForOther()throws IOException {
String filePath = "/home/lazyer/Desktop/a.txt";
FileSystemResource file = new FileSystemResource(filePath);
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getFilename()));
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
return ResponseEntity
.ok()
.headers(headers)
.contentLength(file.contentLength())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(new InputStreamResource(file.getInputStream()));
}
页面代码
<form action="http://localhost:8080/lazycould/upload" method="post" enctype="multipart/form-data">
<!-- 切记这个file标签一定要加multiple属性 不然后台controll获取不到值 会抛出空指针 -->
<input type="file" name="file" multiple>
<input type="submit" value="上传"/>
</form>