springboot-17-springboot的文件上传和下载
单文件上传
1, 需要使用thymeleaf模板: http://www.cnblogs.com/wenbronk/p/6565834.html
src/main/resource/template/file.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="/upload">
<p>文件:<input type="file" name="file" /></p>
<p><input type="submit" value="上传" /></p>
</form>
</body>
</html>
文件上传方法
package com.iwhere.main.controller; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.UUID; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest; /**
* 文件上传controller
*
* @RestController 相当于同时 @Controller和@ResponseBody两个注解
*
* @author wenbronk
* @time 2017年4月6日 下午2:43:03 2017
*/
@RestController
public class FileUploadController { /**
* 文件上传
*
* @return
*/
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String handlFileUpload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) {
return "文件是空的";
} // 读取文件内容并写入 指定目录中
String fileName = file.getOriginalFilename();
// String suffixName = fileName.substring(fileName.lastIndexOf("."));
fileName = UUID.randomUUID() + "|+=|-|" + fileName; File dest = new File("E:/test/" + fileName);
// 判断目录是否存在
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
} try {
file.transferTo(dest);
} catch (IOException e) {
return "后台也不知道为什么, 反正就是上传失败了";
}
return "上传成功";
}
}
多文件上传:
1, thymeleaf
src/main/resource/template/multifile.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="/batch/upload">
<p>文件1:<input type="file" name="file" /></p>
<p>文件2:<input type="file" name="file" /></p>
<p>文件3:<input type="file" name="file" /></p>
<p><input type="submit" value="上传" /></p>
</form>
</body>
</html>
2, 多文件上传方法
/**
* 多文件上传
* 类似单文件上传, 遍历
* @return
*/
@RequestMapping(value = "multiUpload", method = RequestMethod.POST)
public String handleMultiFileupload(HttpServletRequest request) {
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file"); for (MultipartFile multipartFile : files) {
if (multipartFile.isEmpty()) {
return "文件是空的";
} // 读取文件内容并写入 指定目录中
String fileName = multipartFile.getOriginalFilename();
// String suffixName =
// fileName.substring(fileName.lastIndexOf("."));
fileName = UUID.randomUUID() + "|+=|-|" + fileName; File dest = new File("E:/test/" + fileName);
// 判断目录是否存在
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
} try {
multipartFile.transferTo(dest);
} catch (IOException e) {
return "后台也不知道为什么, 反正就是上传失败了";
}
}
return "上传成功";
}
文件下载
/**
* 文件下载
*
* @return
*/
@RequestMapping("/download")
public String downLoadFile(HttpServletRequest request, HttpServletResponse response) {
// 文件名可以从request中获取, 这儿为方便, 写死了
String fileName = "rtsch_ex.json";
// String path = request.getServletContext().getRealPath("/");
String path = "E:/test";
File file = new File(path, fileName); if (file.exists()) {
// 设置强制下载打开
response.setContentType("application/force-download");
// 文件名乱码, 使用new String() 进行反编码
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 读取文件
BufferedInputStream bi = null;
try {
byte[] buffer = new byte[];
bi = new BufferedInputStream(new FileInputStream(new File("")));
ServletOutputStream outputStream = response.getOutputStream();
int i = -;
while (- != (i = bi.read(buffer))) {
outputStream.write(buffer, , i);
}
return "下载成功";
} catch (Exception e) {
return "程序猿真不知道为什么, 反正就是下载失败了";
} finally {
if (bi != null) {
try {
bi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return "文件不存在";
}
文件下载时, 最容易出现文件名乱码的问题, 这儿使用new String() 进行反编码,
String downname = new String(filename.getBytes("gbk"),"iso8859-1");
当然还有个不太稳的方法:
URLEncoder.encode(fileName, "UTF-8"));
还有一种, 不太奏效
springboot-17-springboot的文件上传和下载的更多相关文章
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...
- springboot+web文件上传和下载
一.首先安装mysql数据库,开启web服务器. 二.pom.xml文件依赖包配置如下: <?xml version="1.0" encoding="UTF-8&q ...
- SpringBoot 文件上传、下载、设置大小
本文使用SpringBoot的版本为2.0.3.RELEASE 1.上传单个文件 ①html对应的提交表单 <form action="uploadFile" method= ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- 七、springBoot 简单优雅是实现文件上传和下载
前言 好久没有更新spring Boot 这个项目了.最近看了一下docker 的知识,后期打算将spring boot 和docker 结合起来.刚好最近有一个上传文件的工作呢,刚好就想起这个脚手架 ...
- springboot整合OSS实现文件上传
OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.OSS可用于图片.音视频.日志等海量文件的存储.各种终端 ...
- 精讲响应式WebClient第4篇-文件上传与下载
本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...
- 学习SpringMVC必知必会(7)~springmvc的数据校验、表单标签、文件上传和下载
输入校验是 Web 开发任务之一,在 SpringMVC 中有两种方式可以实现,分别是使用 Spring 自带的验证 框架和使用 JSR 303 实现, 也称之为 spring-validator 和 ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
随机推荐
- Dalvik虚拟机java方法执行流程和Method结构体分析
Method结构体是啥? 在Dalvik虚拟机内部,每个Java方法都有一个对应的Method结构体,虚拟机根据此结构体获取方法的所有信息. Method结构体是怎样定义的? 此结构体在不同的andr ...
- nodejs express hi-cms
今天看一下hi-cm是怎么写的,理解一下流程,看一些亮点 它使用express3.x写的 1.app.set, app.get app.set('port', 3000); app.get('port ...
- CentOS搭建NFS服务
系统结构 ----------------------------------------------------------------------------------------------- ...
- A SQL to insert continuous values
I need a table to store all the working days. I dont like loop, so I tried sql. The following is the ...
- 项目笔记---事半功倍之GhostDoc(二)
前言 前一篇文章<项目笔记---事半功倍之StyleCop(一)>提到如何约束代码,规范代码风格,这一节,我们将了解如何快速生成符合规则的代码注释---GhostDoc 一.安装Ghost ...
- 项目笔记---WPF多语言方案
近期由于朋友邀请帮忙给一个开源的游戏“外挂”做一个I18N的解决方案,恰好也是WPF做的,之前有过相关经验,就忙了一个星期终于搞定了,已经提交给作者了,现在这里做一个分享. 这里分享下我个人Fork的 ...
- vue-router页面传值及接收值
主页 “去第二个页面”方法传值1 <template> <div id="app"> <div><router-link to=&quo ...
- c#使用NPOI快速导出到Excel
接上篇博文<C#快速导出到excel>:由于此种方法不能导出成.xlsx格式,为解决此问题,本次分享使用NPOI. 参考:https://www.cnblogs.com/lazyneal/ ...
- 关于ORACLE的字符窜存储(未完善,欢迎补充)
oracle中常见的用于存储字符串的数据类型有: 数据类型 是否定长 最多存储数 效率排行 备注 是否oracle特有 英文占位 中文占位 char 是 2000 比VARCHAR2稍高 char的长 ...
- Android Source 源码已下载但 Android Studio 找不到的解决办法
Android Studio 2.1 reporting in: solved the issue by resetting SDK. Preferences -> Appearance &am ...