web包下载_springmvc文件上传和下载,下载excel模板和导入excel数据(poi解析) - wenbin_ouyang...

目录:

1、springmvc文件下载
2、springmvc文件上传
3、下载excel模板的demo
4、导入excel数据的demo

1、springmvc文件下载    <--返回目录

转自:springmvc文件下载

文件下载是web项目中常用的服务,在springmvc中常用ResponseEntity类来事项文件下载

、ResponseEntity

ResponseEntity类实现响应头、文件数据(以字节存储)、状态封装在一起交给浏览器处理以实现浏览器的文件下载。简单的说ResponseEntity可以折这HttpHeaders和HttpStatus,通过对HttpHeaders和HttpStatus的设置可以使浏览器执行下载操作。

、实现文件下载

步骤

  1. 获取到文件的存放的真实路径
  2. 根据接收到的文件名和文件真实路径创建文件实例(注意:这里不是创建一个文件,而是创建一个File型的实例)
  3. 设置响应头Content-Disposition浏览器根据这个响应头执行相应的操作和要下载的文件名
  4. 设置响应内容的MIME类型,以二进制流形式传输
  5. 返回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起效果,传输类型也为二进制。

b00183f81d7b6c8b39721d1b1041690c.png

2、springmvc文件上传    <--返回目录

转自:springmvc文件上传

文件的上传与下载基本上是web项目中会用到的技术,在web学习中我们用到的是 Apache fileupload这个组件来实现上传,在springmvc中对它进行了封装,让我们使用起来比较方便,但是底层还是由Apache fileupload来实现的。springmvc中由MultipartFile接口来实现文件上传。

、MultipartFile接口

该接口用来实现springmvc中的文件上传操作,它有两个实现类:

6c6e54209583f52d7ee1964aeedd3566.png

 接口定义的方法:

bed57291a6424c48ff48fdf698b77c41.png

、实现文件上传

导入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    <--返回目录

e4b618ad8741cebe7791bf3b956f955d.png

  excel模板设置单元格数据格式

64a8c4c78496d982695418ad59246913.png

   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);
        ();
        ();
    }

}

f2567aaf2f8492c66cfc04fb9f327cd1.png

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(());
        }
    }
}

---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值