Java解析上传的zip文件--包含Excel解析与图片上传

这篇具有很好参考价值的文章主要介绍了Java解析上传的zip文件--包含Excel解析与图片上传。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java解析上传的zip文件--包含Excel解析与图片上传

前言:今天遇到一个需求:上传一个zip格式的压缩文件,该zip中包含人员信息的excel以及excel中每行对应的人的图片,现在需要将该zip压缩包中所有内容解析导入到数据库中,包括图片,并将图片与excel内容对应。

代码演示:

/**
* 信息导入Controller
*/
@RestController
@RequestMapping("/import")
public class ImportController {
    
    
   @AutoWired
   private IExcelService excelService

    /**
    * 接收zip
    * zip中包含了人员excel以及excel中每行对应的人员图片--默认每个人员图片的名称为number号
    */
    @PostMapping(value = "/zip")
    @Transactional
    public void sendRequest(@RequestParam("file") MultipartFile zipFile) throws IOException {
        //通过zip名称创建一个file文件-该文件无具体路径
          File file = new File(Objects.requireNonNull(zipFile.getOriginalFilename()));
        //将zip写入到file中
          FileUtils.writeByteArrayToFile(file, zipFileFile.getBytes());
        //设定字符集编码--这一步必须,否则放到linux服务器中会有字符集报错
          Charset charset = Charset.forName("GBK");
          ZipFile zipFile = new ZipFile(file, charset);
        //开始读取zip中文件
          Enumeration<? extends ZipEntry> entries = zipFile.entries();
        //创建excelZip存放zip中的excel文件内容
          List<ZipEntry> excelZip = new ArrayList<ZipEntry>();
        //创建imgZip存放zip中的图片文件
          List<ZipEntry> imgZip = new ArrayList<ZipEntry>();
        
        //开始读取zip文件
    	  while (entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();
              //通过文件名称去过滤出excel
            if (entry.getName().contains("/excel表格名称.xlsx")) {
                excelZip.add(entry);
            }
              //获取包含图片目录下所有的图片信息
            if (!entry.isDirectory() && entry.getName().contains("图片目录的名称")) {
                imgZip.add(entry);
            }
        }
        //创建文件输入流,将excel变为流
         InputStream excelInputStream = zipFile.getInputStream(excelZip.get(0));
        //创建EasyExcel中的监听器
         ExcelListener excelListener = new ExcelListener();
        //调用EasyExcel中的EasyExcelFactory方法去读取输入流
        EasyExcelFactory.read(excelInputStream,Excel.class,excelListener).sheet().doRead();
        //到此完成获取压缩包中excel的人员信息
        List<Excel> excelList = excelListener.getDataList();
        
        //遍历读取图片
        imgZip.stream().forEach(zip -> {
        try {
             //创建压缩图片的输入流
               InputStream imgInputStream = zipFile.getInputStream(zip);
             //调用流转文件的方法
               File img = stream2file(imgInputStream);
               for (Excel excel : excelList) 
               {
                //将去除后缀的压缩图片名称与excel中的人员号码字段做比较
                if (removeExtension(zip.getName()).contains(excel.getNum())) {
                    //调用文件上传接口,上传到服务器目录下,并返回文件存储路径
                    //这边FileUpload.upload为自己写的一个上传接口,此处省略。。。
                    //如果接受对象为MultipartFile,还需调用fileToMultipartFile转换
                        String urlPath =FileUpload.upload(fileToMultipartFile(img));
                    //进行对象的保存
                        Excel e=new Excel();
                    //设置存储的图片地址
                        e.setPath(urlPath);
                    //调用存储接口存储图片与excel信息
                        excelService.insert(e);
                    }
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }

   //设置文件名前缀;必须至少三个字符
    static final String PREFIX = "stream2file";
    //设置定义文件的后缀扩展名;如果为null,则将使用后缀".tmp"
    //这边为图片格式,所以默认给的后缀为jpg格式
    static final String SUFFIX = ".jpg";
    
   /**
    * 输入流转文件
    * 该方法为在内存中创建临时文件,不进行磁盘存储
    */
    public static File stream2file(InputStream in) throws IOException {
        //创建临时文件
        final File tempFile = File.createTempFile(PREFIX, SUFFIX);
        tempFile.deleteOnExit();
        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            IOUtils.copy(in, out);
        }
        return tempFile;
    }
    
   /**
    * 截取文件名称--去除后缀名(.jpg等)
    */
    public static String removeExtension(String fileName) {
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex == -1) {
            // 如果文件名中没有后缀,则返回原文件名
            return fileName;
        } else {
            // 截取从开头到最后一个`.`字符之前的部分
            return fileName.substring(0, lastDotIndex);
        }
    }
    
     /**
     * file转MultipartFile
     *
     * @param file file
     * @return MultipartFile
     */
    public static MultipartFile fileToMultipartFile(File file) {
        MultipartFile result = null;
        if (null != file) {
            try (FileInputStream input = new FileInputStream(file)) {
                result = new MockMultipartFile(file.getName().concat("temp"), file.getName(), "text/plain", input);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
   }  
}

回顾:

博主解答思路为:

  1. 接收压缩文件
  2. 解析压缩文件,并区分excel与图片文件
  3. 将excel与图片进行匹配,将匹配成功的数据存储到数据库中

要点:文章来源地址https://www.toymoban.com/news/detail-746529.html

  1. 本次读取几乎都是内存读取,将数据读取到内存中,也在磁盘中建立了临时文件
  2. 解析时需要进行多次类型转换
  3. new ZipFile(file, charset)这一步一定要设定字符集编码,并查看window与linux字符集编码的区别,否则会因为字符集编码问题报错而无法运行

到了这里,关于Java解析上传的zip文件--包含Excel解析与图片上传的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序上传文件(图片)至阿里云OSS,包含后端代码示例。

    ps:本文较为详细,需要有耐心的阅读,要是图片看不清楚可以下载到本地放大查看。 写这篇博客的主要目的是因为serverless架构下直接上传图片只能转base64,且body大小有限制 一、在阿里云创建RAM用户与角色 1.为什么要使用RAM用户? 云账号 AccessKey 是您访问阿里云 API 的密钥,具

    2024年02月04日
    浏览(32)
  • Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三

    首先如果大家的富文本中不考虑图片或者附件的情况下,只考虑纯文本且排版的情况下我们可以直接让前端的vue来继承UEditor就可以啦。但是要让前端将那几个上传图片和附件的哪些功能给阉割掉! 然后就是说如果考虑到了上传图片或者视频和附件那么咱们还是用的前后分离

    2024年02月15日
    浏览(39)
  • 使用Java将word解析出来,包含格式和图片

    1、需求:         a. 将word中的内容按照层级结构解析出来         b. 不区分文件的后缀         c. 包含word的样式 2、思路:总体思路分为存和取,存的是文档的标题和内容、图片等;取的是文档的树形结构。         (1). 存:将word中的标题、内容、图片获取出来并进行存

    2024年02月06日
    浏览(29)
  • 后端:使用easyExcel实现解析Excel文件读取数据。前端:Excel模板下载、前端上传文件

            本篇是EasyExcel快速入门知识,讲解如何读取Excel文件,对Excel中错误信息如空字符、必填项为空、表格格式校验做到处理 ,并给出了实际项目中示例代码;为什么要使用easyexcel;原因是相比于poi,easyexcel更加轻量级,读取写入API方便,并且在工作中占用内存较小;

    2024年02月05日
    浏览(49)
  • 028:vue上传解析excel文件,列表中输出内容

    第028个 查看专栏目录: VUE ------ element UI 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使用,computed,watch,生命周期(beforeCreate,created,beforeMount,mounted, beforeUpdate,upda

    2024年02月09日
    浏览(27)
  • 微信小程序上传文件(可传 word、excel、ppt、视频、图片……)

    近期做技术调研时发现微信官方支持文件上传了,这里记录一下 官方 API:wx.chooseMessageFile(Object object) 交互:从微信聊天里选择文件(选一个好友/群聊,从你们聊天记录里的文件里选) 点红框是预览,点右上角圆圈才是选中(昨天做技术调研时点红圈部分是预览,搞得我还以

    2024年02月11日
    浏览(52)
  • Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载

    业务需求:从数据库查询多个list集合信息封装excel,每个excel都有2个sheet页,填充不同的信息,最后将所有excel打包成zip文件,以流的形式返回给客户端,供客户端另存为窗口下载。 只发出一次请求 每个excel表中到数据记录不能超过2条 excel文件或者zip包不会上传服务器,而是

    2024年02月06日
    浏览(39)
  • Springboot通过前端发起请求,上传excel文件解析数据 postman进行操作

    springboot版本3.2.0,数据库版本8 mybatisplus版本3.5.4.1 controller层 测试结果 后端返回数据 Postman返回数据 注意 使用postman进行测试时,需要把key传进去,不然会报空文件异常,

    2024年01月18日
    浏览(40)
  • Java使用POI解析带图片的excel,简洁好用

            这天遇到这个这样的需求,需要导入表格中的数据,还得支持带图片;这应该难不倒咱阿里的EasyExcel,打开官网文档一看哦豁,明确表示暂时不支持解析带图片的Excel...... 好了,这下只能看POI了,然后想起来项目里引入的HuTools工具类,它应该封装好了吧;于是决定用

    2024年02月11日
    浏览(29)
  • java创建excel文件和解析excel文件

    运行结果

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包