目录:
1、springmvc文件下载
2、springmvc文件上传
3、下载excel模板的demo
4、导入excel数据的demo
1、springmvc文件下载 <--返回目录
转自:springmvc文件下载
、
文件下载是web项目中常用的服务,在springmvc中常用ResponseEntity类来事项文件下载
、ResponseEntity
ResponseEntity类实现响应头、文件数据(以字节存储)、状态封装在一起交给浏览器处理以实现浏览器的文件下载。简单的说ResponseEntity可以折这HttpHeaders和HttpStatus,通过对HttpHeaders和HttpStatus的设置可以使浏览器执行下载操作。
、实现文件下载
步骤:
- 获取到文件的存放的真实路径
- 根据接收到的文件名和文件真实路径创建文件实例(注意:这里不是创建一个文件,而是创建一个File型的实例)
- 设置响应头Content-Disposition浏览器根据这个响应头执行相应的操作和要下载的文件名
- 设置响应内容的MIME类型,以二进制流形式传输
- 返回ResponseEntity
@RequestMapping("/download")
public ResponseEntity<byte[]> download(@RequestParam("fileName") String fileName, HttpServletRequest req)
throws IOException {
// 获取文件存放的真实路径
String realPath = ().getRealPath("/WEB-INF/file");
//创建文件实例
File file = new File(realPath, fileName);
//修改文件名的编码格式
String downloadFileName = new String(("UTF-8"), "UTF-8");
//设置httpHeaders,使浏览器响应下载
HttpHeaders headers = new HttpHeaders();
//告诉浏览器执行下载的操作,“attachment”告诉了浏览器进行下载,下载的文件 文件名为 downloadFileNameheaders.setContentDispositionFormData("attachment", downloadFileName);
//设置响应方式为二进制,以二进制流传输 ();
returnnew ResponseEntity<byte[]>((file), headers, );
}
、火狐浏览器测试
从图中我们可以看到,我们设置的Content-Disposition起效果,传输类型也为二进制。
2、springmvc文件上传 <--返回目录
转自:springmvc文件上传
、
文件的上传与下载基本上是web项目中会用到的技术,在web学习中我们用到的是 Apache fileupload这个组件来实现上传,在springmvc中对它进行了封装,让我们使用起来比较方便,但是底层还是由Apache fileupload来实现的。springmvc中由MultipartFile接口来实现文件上传。
、MultipartFile接口
该接口用来实现springmvc中的文件上传操作,它有两个实现类:
接口定义的方法:
、实现文件上传
导入jar包
- commons-fileupload
- commons-io
commons-io可以不用自己导入,maven会自动导入对应版本的jar
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>.2</version></dependency>
前端jsp页面
input的type设置为file
form表单的method设为post,
form表单的enctype设置为multipart/form-data,以二进制的形式传输数据。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="ISO-8859-1"><title>Insert title here</title></head><body><form action="/ssm/file/imgUpload" enctype="multipart/form-data" method="post"><input type="file" name="file"><br><br><input type="submit" value="上传"></form></body></html>
Controller层接收
使用MultipartFile对象作为参数,接收前端发送过来的文件,将文件写入本地文件中,就完成了上传操作
@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest req)
throws IllegalStateException, IOException {
// 判断文件是否为空,空则返回失败页面if (()) {
return "failed";
}
// 获取文件存储路径(绝对路径)
String path = ().getRealPath("/WEB-INF/file");
// 获取原文件名
String fileName = ();
// 创建文件实例
File filePath = new File(path, fileName);
// 如果文件目录不存在,创建目录if (!().exists()) {
().mkdirs();
("创建目录" + filePath);
}
// 写入文件 (filePath);
return "success";
}
配置CommonsMultipartResolver
<bean id="multipartResolver"
class=""><!--上传文件的最大大小,单位为字节 --><property name="maxUploadSize" value="17367648787"></property><!-- 上传文件的编码 --><property name="defaultEncoding" value="UTF-8"></property></bean>
3、下载excel模板的demo <--返回目录
excel模板设置单元格数据格式
pom.xml
PoiController
package com.oy.controller;
import java.io.InputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
publicclass PoiController {
@RequestMapping("/poi/download")
publicvoid download(HttpServletResponse response) throws Exception {
InputStream is = getClass().getClassLoader().getResourceAsStream("static/exceltemplates/");
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook wb = new HSSFWorkbook(fs);
(response, wb, "下载模板");
}
}
ResponseUtil
package com.oy.controller;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Workbook;
publicclass ResponseUtil {
/**
* 导出(或下载模板)
*
* @param response
* @param wb excel 工作簿
* @param fileName 导出 excel 的文件名, 含后缀
* @throws Exception
*/publicstaticvoid export(HttpServletResponse response, Workbook wb, String fileName) throws Exception {
("Content-Disposition", "attachment;filename=" + new String(("utf-8"), "iso8859-1"));
("application/");
OutputStream out = ();
(out);
();
();
}
}
4、导入excel数据的demo <--返回目录
ExcelController
package com.guanxin.pm.controller.common;
import com.guanxin.base.annotation.Controller;
import com.guanxin.base.annotation.RequestParam;
import com.guanxin.base.annotation.Wrapper;
import com.guanxin.base.exception.ServiceException;
import com.guanxin.pm.facade.common.ExcelFacade;
import com.guanxin.web.utils.datatable.ctr.AjaxResponseWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
@Controller
@Component("/zxl_pm/common/")
@Wrapper(AjaxResponseWrapper.class)
publicclass ExcelController {
@Autowired
private ExcelFacade excelFacade;
/**
* 模板数据(数据实体和数据字段)导入数据库: 下载模板后, 手动填充数据后上传; 后台读取数据, 导入数据库;
*
* @param file
*/publicvoid importEntityAndFieldFromTemplate(@RequestParam("upFile") MultipartFile file,
@RequestParam("zxlPrdId") String zxlPrdId) throws Exception {
(zxlPrdId, "zxlPrdId不能为空");
// 判断文件是否为空, 空则直接返回if (file == null || ()) return;
String fileName = (); //获取上传文件原名
// 判断文件是否为 excel 文件if (!((".xls") || (".xlsx"))) {
thrownew ServiceException("请上传 excel 格式文件");
}
(file, zxlPrdId);
}
}
ExcelFacadeImpl
package com.guanxin.pm.facade.common.impl;
import com.guanxin.base.exception.ServiceException;
import com.guanxin.hibernate.annotations.Tx;
import com.guanxin.hibernate.support.HibernateSupport;
import com.guanxin.pm.dto.product.request.ZxlPrdRequestEntityDto;
import com.guanxin.pm.dto.product.request.ZxlPrdRequestFieldDto;import com.guanxin.pm.entity.product.request.ZxlPrdRequestEntity;import com.guanxin.pm.enums.product.request.*;
import com.guanxin.pm.facade.common.ExcelFacade;
import com.guanxin.pm.facade.product.request.*;
import com.guanxin.pm.utils.CommonUtil;
import com.guanxin.pm.utils.ExcelUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
/**
* @Author oy
* @Date 2020/11/10 17:20
*/
@Tx
@Component
publicclass ExcelFacadeImpl extends HibernateSupport implements ExcelFacade {
@Autowired
private EntityFacade entityFacade;
@Autowired
private FieldFacade fieldFacade;/**
* 模板数据导入数据库: 下载模板后, 手动填充数据后上传; 后台读取数据, 导入数据库;
*
* @param file
* @throws Exception
*/
@Override
publicvoid importEntityAndFieldFromTemplate(MultipartFile file, String zxlPrdId) throws Exception {
//InputStream is = new FileInputStream("e:\\"); // 用于测试
InputStream is = (); // file ==> 输入流
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook wb = new HSSFWorkbook(fs); // 输入流 ==> excel 工作簿
HSSFSheet entitySheet = (0); // 获取第一个Sheet页(数据实体)if (entitySheet == null) return;
importEntity(entitySheet, zxlPrdId);
HSSFSheet fieldSheet = (1); // 获取第二个Sheet页(数据字段)if (fieldSheet == null) return;
importField(fieldSheet, zxlPrdId);
}/**
* 导入数据实体
*
* @param hssfSheet
* @throws Exception
*/privatevoid importEntity(HSSFSheet hssfSheet, String zxlPrdId) throws Exception {
// 遍历行Rowfor (int rowNum = 1; rowNum <= (); rowNum++) {
HSSFRow hssfRow = (rowNum);
if (hssfRow == null) {
continue;
}
ZxlPrdRequestEntityDto dto = new ZxlPrdRequestEntityDto();
(zxlPrdId);
// 遍历列Cellfor (int cellNum = 0; cellNum <= (); cellNum++) {
HSSFCell hssfCell = (cellNum);
if (hssfCell == null) {
continue;
}
switch (cellNum) {
case 0: // 数据实体名 ((hssfCell));
break;
case 1: // 数据实体编号 ((hssfCell));
break;
case 2: // 类型
String entityTypeVal = ((hssfCell), RequestEntityTypeEnum.class);
if ((entityTypeVal)) {
((entityTypeVal));
}
break;
case 3: // 修改模式
String editModelVal = ((hssfCell), RequestEntityEditModelEnum.class);
if ((editModelVal)) {
((editModelVal));
}
break;
case 4: // 计算方式
String capacityTypeVal = ((hssfCell), RequestEntityCapacityTypeEnum.class);
if ((capacityTypeVal)) {
((capacityTypeVal));
}
break;
case 5: // 数量
String capacityVal = (hssfCell);
int index = (".");
if (index > 0) {
capacityVal = (0, index);
}
((capacityVal));
break;
case 6: // 说明 ((hssfCell));
break;
default:
break;
}
}
((), "产品id不能为空");
((), "数据实体中文名不能为空");
((), "数据实体类型不能为空");
((), "数据修改模式不能为空");
((), "数据计算方式不能为空");
(dto);
}
();
}
/**
* 导入数据字段
*
* @param hssfSheet
* @throws Exception
*/privatevoid importField(HSSFSheet hssfSheet, String zxlPrdId) throws Exception {
// 遍历行Rowfor (int rowNum = 1; rowNum <= (); rowNum++) {
HSSFRow hssfRow = (rowNum);
if (hssfRow == null) {
continue;
}
ZxlPrdRequestFieldDto dto = new ZxlPrdRequestFieldDto();
(zxlPrdId);
// 遍历列Cellfor (int cellNum = 0; cellNum <= (); cellNum++) {
HSSFCell hssfCell = (cellNum);
if (hssfCell == null) {
continue;
}
switch (cellNum) {
case 0: // 数据实体名称
String entityNameVal = (hssfCell);
ZxlPrdRequestEntity entity = (zxlPrdId, entityNameVal);
if (entity == null) {
thrownew ServiceException("导入数据字段时, 找不到数据实体为[" + entityNameVal + "]的记录");
}
(());
break;
case 1: // 字段中文名称 ((hssfCell));
break;
case 2: // 字段类型
String fieldTypeVal = ((hssfCell), RequestFieldTypeEnum.class);
if ((fieldTypeVal)) {
((fieldTypeVal));
}
break;
case 3: // 输入方式
String inputControlVal = ((hssfCell), RequestFieldInputControlEnum.class);
if ((inputControlVal)) {
((inputControlVal));
}
break;
case 4: // 字段长度
String fieldLengthVal = (hssfCell);
int index = (".");
if (index > 0) {
fieldLengthVal = (0, index);
}
((fieldLengthVal));
break;
case 5: // 默认值 ((hssfCell));
break;
case 6: // 字段描述 ((hssfCell));
break;
case 7: // 是否允许为空
String isNullVal = (hssfCell);
Boolean isNull = ("是".equals(isNullVal) || (isNullVal)); // 默认允许为空 (isNull);
break;
case 8: // 是否为主键
String isKeyVal = (hssfCell);
Boolean isKey = ("是".equals(isKeyVal) || (isKeyVal));
(isKey);
break;
default:
break;
}
}
((), "产品id不能为空");
((), "数据实体id不能为空");
((), "中文名称不能为空");
((), "字段类型不能为空");
(dto);
}
();
}
}
ExcelUtils
package com.guanxin.pm.utils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
/**
* @Author oy
* @Date 2020/11/10 14:49
*/publicclass ExcelUtils {
/**
* 导出(或下载模板)
*
* @param response
* @param wb excel 工作簿
* @param fileName 导出 excel 的文件名, 含后缀
* @throws Exception
*/publicstaticvoid export(HttpServletResponse response, Workbook wb, String fileName) throws Exception {
("Content-Disposition", "attachment;filename=" + new String(("utf-8"), "iso8859-1"));
("application/");
OutputStream out = ();
(out);
();
();
}
/**
* 获取 excel 单元格的值
*
* @param hssfCell
* @return*/publicstatic String getCellValue(HSSFCell hssfCell) {
if (() == ) {
return String.valueOf(());
} elseif (() == ) {
return String.valueOf(());
} else {
return String.valueOf(());
}
}
}
---