上传文件
思路:
1.设置上传的路径,上传名
2.在这个路径path上新建名为filename的文件 file
3.判断该文件的父目录是否存在,若不存在就新建一个
4.用.transferTo方法将文件上传到该目录中
@RequestMapping(value="/register")
public String register(HttpServletRequest request,
@ModelAttribute User user,
Model model)throws Exception{
// 接收参数username
System.out.println("username = " +user.getUsername());
// 如果文件不为空,写入上传路径
if(!user.getHeadPortrait().isEmpty()){
// 上传文件路径
String path = request.getServletContext().getRealPath("/upload/");
System.out.println("path = " + path);
// 上传文件名
String filename = user.getHeadPortrait().getOriginalFilename();
File filepath = new File(path,filename);
// 判断路径是否存在,如果不存在就创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
// 将上传文件保存到一个目标文件当中
user.getHeadPortrait().transferTo(new File(path+File.separator+ filename));
// 将用户添加到model
model.addAttribute("user", user);
System.out.println(request.getServletContext().getRealPath("/upload/"));
return "userInfo";
}else{
return "error";
}
}
提交的表单类型必须是 enctype="multipart/form-data"
<form class="form-horizontal" action="register" enctype="multipart/form-data" method="post">
</form>
注意:
如果不创建webapp文件夹和导入servlet的pom就会乱上传
如:C:\temp\Temp\tomcat-docbase.5582293453384459029.8080\upload\
<!-- 添加 servlet 依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
若添加了就会上传到项目里
如:D:\IDEA\IDEAworkspace\fileuploadtest\src\main\webapp\upload
下载文件
思路:
1.给定下载的路径 path 和名称 filename
2.在这个路径path上找到这个名为filename的文件 file
3.最后通过BodyBuilder把这个文件file的内容下载下来
@RequestMapping(value="/download")
public ResponseEntity<byte[]> download(HttpServletRequest request,
@RequestParam("filename") String filename,
@RequestHeader("User-Agent") String userAgent,
Model model)throws Exception{
// 下载文件路径
String path = request.getServletContext().getRealPath(
"/upload/");
// 构建File
File file = new File(path+File.separator+ filename);
// ok表示Http协议中的状态 200
ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
// 内容长度
builder.contentLength(file.length());
// application/octet-stream : 二进制流数据(最常见的文件下载)。
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
// 使用URLDecoder.decode对文件名进行解码
filename = URLEncoder.encode(filename, "UTF-8");
// 设置实际的响应文件名,告诉浏览器文件要用于【下载】、【保存】attachment 以附件形式
// 不同的浏览器,处理方式不同,要根据浏览器版本进行区别判断
if (userAgent.indexOf("MSIE") > 0) {
// 如果是IE,只需要用UTF-8字符集进行URL编码即可
builder.header("Content-Disposition", "attachment; filename=" + filename);
} else {
// 而FireFox、Chrome等浏览器,则需要说明编码的字符集
// 注意filename后面有个*号,在UTF-8后面有两个单引号!
builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);
}
return builder.body(FileUtils.readFileToByteArray(file));
}
下载要导入的pom
<!-- Apache Commons FileUpload组件依赖,
由于不属于Spirng Boot,所以需要加上版本
-->
<!--用于上传下载文件-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
</dependencies>
直接将数据导出到excel表格,但是不能指定路径
思路:
1.获取所有学生的数据
2.到服务层–>
新建一个XSSFWorkbook类 对象是wb
生成一个工作表
生成第一行
生成样式
循环把每列的属性设上去
循环设置每列应该输入的数据的值
3.设定导出的路径 path 和名称 filename (后台写死了)
4.在这个路径path上新建名为filename的文件 file
5.新建一个文件输出流FileOutputStream->fos 把 wb获取的以excel保存的学生信息 输出到file文件里,并关闭输出流
控制层
@RequestMapping(value = "/exportExcel")
public String exportExcel(HttpServletRequest request,
HttpServletResponse response,
Model model)
throws Exception {
//所有学生列表
List<User> list=userService.findAllStudent1();
//导出变成wb
XSSFWorkbook wb = userService.export(list);
//文件路径
String filePath = "D:";//文件保存路径
String fileName = "测试文件.xlsx";//文件名称
//新建一个文件,给定路径
File xlsFile = new File(filePath,fileName);
//新建输出流把学生数据输出到本地,输出到xlsFile的那个文件中
FileOutputStream fos = new FileOutputStream(xlsFile);//创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
wb.write(fos);//将文档对象写入文件输出流
fos.close();//关闭流
System.out.println("导出完成");
return "redirect:/student/student/1/3";
}
服务层
//导出excel表格
//定义表头
String[] excelHeader = {"学号","姓名", "分数", "班级"};
public XSSFWorkbook export(List<User> list) {
//这里需要说明一个问题:如果是 Offices 2007以前的Excel版本,new的对象是:**HSSFWorkbook** ,Offices 2007以后的Excel版本new的对象才是XSSFWorkbook
XSSFWorkbook wb = new XSSFWorkbook();
//生成一个工作表
Sheet sheet = wb.createSheet("你好");
//生成第一行
Row row = sheet.createRow((int) 0);
//生成单元格的样式style
XSSFCellStyle style = wb.createCellStyle();
//style.setAlignment(CellStyle.ALIGN_CENTER);
for (int i = 0; i < excelHeader.length; i++) {
//获取每一个单元格
Cell cell = row.createCell(i);
//给单元格赋值
cell.setCellValue(excelHeader[i]);
//设置单元格的样式
cell.setCellStyle(style);
}
for (int i = 0; i < list.size(); i++) {
//得到当前行数的下一行(row.getRowNum():得到当前行数)
row = sheet.createRow(row.getRowNum() + 1);
User user = list.get(i);
//赋值
if(!user.getId().isEmpty()){
row.createCell(0).setCellValue(user.getId());
}
if(!user.getUsername().isEmpty()){
row.createCell(1).setCellValue(user.getUsername());
}
if(user.getScore()!=null){
row.createCell(2).setCellValue(user.getScore());
}
if(user.getTeam()!=null){
row.createCell(3).setCellValue(user.getTeam());
}
}
return wb;
}
需要导入的pom
<!-- POI提供API给Java程序对Microsoft Office格式档案读和写的功能。-->
<!--可用于导出excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
直接将数据导出到excel表格,可以指定路径
思路:
1.获取所有学生的数据
2.到服务层–>
新建一个XSSFWorkbook类 对象是wb
生成一个工作表
生成第一行
生成样式
循环把每列的属性设上去
循环设置每列应该输入的数据的值
3.设定路径 path(把路径设置到项目的webapp的文件夹里) 和名称 filename
4.在这个路径path上找到这个名为filename的文件 file,如果没有就新建,有了就覆盖
5.新建一个文件输出流FileOutputStream->fos 把 wb获取的以excel保存的学生信息 输出到file文件里,并关闭输出流
6.最后通过BodyBuilder把这个文件file的内容从webapp的路径上下载下来
控制层
@RequestMapping(value = "/exportExcel")
public ResponseEntity<byte[]> exportExcel(HttpServletRequest request,
@RequestHeader("User-Agent") String userAgent,
Model model)throws Exception {
//所有学生列表
List<User> list=userService.findAllStudent1();
//导出变成wb
XSSFWorkbook wb = userService.export(list);
//新建一个文件保存excel,excel放的路径path
String path = request.getServletContext().getRealPath(
"/upload/");
String filename="学生成绩分班表.xlsx";
File file = new File(path+File.separator+filename);
//新建输出流把学生数据输出到path的路径上,输出到file的那个文件中
FileOutputStream fos = new FileOutputStream(file);//创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
wb.write(fos);//将文档对象写入文件输出流
fos.close();//关闭流
System.out.println("导出到webapp的upload文件夹完成");
// ok表示Http协议中的状态 200
ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
// 内容长度
builder.contentLength(file.length());
// application/octet-stream : 二进制流数据(最常见的文件下载)。
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
// 使用URLDecoder.decode对文件名进行解码
filename = URLEncoder.encode(filename, "UTF-8");
// 设置实际的响应文件名,告诉浏览器文件要用于【下载】、【保存】attachment 以附件形式
// 不同的浏览器,处理方式不同,要根据浏览器版本进行区别判断
if (userAgent.indexOf("MSIE") > 0) {
// 如果是IE,只需要用UTF-8字符集进行URL编码即可
builder.header("Content-Disposition", "attachment; filename=" + filename);
} else {
// 而FireFox、Chrome等浏览器,则需要说明编码的字符集
// 注意filename后面有个*号,在UTF-8后面有两个单引号!
builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);
}
return builder.body(FileUtils.readFileToByteArray(file));
}
服务层
//导出excel表格
//定义表头
String[] excelHeader = {"学号","姓名", "分数", "班级"};
public XSSFWorkbook export(List<User> list) {
//这里需要说明一个问题:如果是 Offices 2007以前的Excel版本,new的对象是:**HSSFWorkbook** ,Offices 2007以后的Excel版本new的对象才是XSSFWorkbook
XSSFWorkbook wb = new XSSFWorkbook();
//生成一个工作表
Sheet sheet = wb.createSheet("你好");
//生成第一行
Row row = sheet.createRow((int) 0);
//生成单元格的样式style
XSSFCellStyle style = wb.createCellStyle();
//style.setAlignment(CellStyle.ALIGN_CENTER);
for (int i = 0; i < excelHeader.length; i++) {
//获取每一个单元格
Cell cell = row.createCell(i);
//给单元格赋值
cell.setCellValue(excelHeader[i]);
//设置单元格的样式
cell.setCellStyle(style);
}
for (int i = 0; i < list.size(); i++) {
//得到当前行数的下一行(row.getRowNum():得到当前行数)
row = sheet.createRow(row.getRowNum() + 1);
User user = list.get(i);
//赋值
if(!user.getId().isEmpty()){
row.createCell(0).setCellValue(user.getId());
}
if(!user.getUsername().isEmpty()){
row.createCell(1).setCellValue(user.getUsername());
}
if(user.getScore()!=null){
row.createCell(2).setCellValue(user.getScore());
}
if(user.getTeam()!=null){
row.createCell(3).setCellValue(user.getTeam());
}
}
return wb;
}