JavaWeb实现多文件上传及zip打包下载

本文实例为大家分享了javaweb多文件上传及zip打包下载的具体代码,供大家参考,具体内容如下

项目中经常会使用到文件上传及下载的功能。本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分。

首先明确一点:

无法通过页面的无刷新ajax请求,直接发下载、上传请求。上传和下载,均需要在整页请求的基础上实现。项目中一般通过构建form表单形式实现这一功能。

一、多文件上传

项目需求为实现多图片上传功能。参考测试了网上找到的众多插件方法后,决定选用Jquery原始上传方案。以下按步骤贴出具体代码。

1、HTML部分(可省略使用js构建)

<form id="uploadForm" method="post" enctype="multipart/form-data">
 <input type="file" hidden name="fileImage" multiple/>
 <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" id="fileSubmit" onclick="uploadFileMulti()">上传资料</a>
</form>

有几点说明:

1. form中 enctype=”multipart/form-data”
2. 例中使用标签,构建submit

2、JS部分

var formData = new FormData($("#uploadForm")[0]);
formData.append("foldName", "datumList");  //设置父级文件夹名称

formData.append("oderCode", selfOrderCode);
formData.append("datumType", datumType);
$.ajax({
 type: "POST",
 data: formData,
 url: "order/datumList/batchInsertDatumLists",
 contentType: false,
 processData: false,
 success: function (result) {
  if (result.success) {

   //清空框文件内容
   $("#fileImage").val("");
   var obj = document.getElementById('fileImage');
   obj.outerHTML = obj.outerHTML;

   refreshDatumList();
   showSuccessToast(result.message);
  } else {
   showWarningToast(result.message);
  }
 },
 error: function () {
  showErrorToast('请求失败!')
 }
});

以上有几点说明:

1. var formData = new FormData($(“#uploadForm”)[0]);
2. 使用 formData.append(“oderCode”, selfOrderCode); 添加其他参数

Java后台

MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
List<MultipartFile> files = mRequest.getFiles("fileImage");

以上有几点说明:

1. 获取MultipartHttpServletRequest,对应file标签的name

二、文件批量下载

本项目中,需求为批量下载某一批次文件。使用zip在服务器压缩文件,之后将文件下载到客户机。
网上查询,使用Java自带的文件输出类不能解决压缩文件中文件名乱码的问题。解决方法:使用ant.jar包,创建压缩文件时,可以设置文件的编码格式,文件名乱码的问题就解决了。

HTML部分(可省略使用js构建)

<form id="uploadForm" method="post" enctype="multipart/form-data">
 <div class="product-dl">
  <input type="hidden" name="orderCode"/>
  <input type="hidden" name="datumType"/>
  <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" class="btn" onclick="batchDatumListDownLoad()">批量下载</a>
 </div>
</form>

JS部分

//批量下载
function batchDatumListDownLoad() {
 var param = {};
 param.datumType = $("#datumTypeQ").val();
 if (param.datumType == -1) {
  param.datumType = null;  //查询所有
 }
 param.orderCode = selfOrderCode;

 $("#uploadForm input[name=orderCode]").val(param.orderCode);
 $("#uploadForm input[name=datumType]").val(param.datumType);

 var form = $("#uploadForm")[0];
 form.action = "order/datumList/batchDownLoadDatumList";
 form.method = "post";
 form.submit();//表单提交
}

后台部分

public void batchDownLoadDatumList(DatumListVo datumListVo, HttpServletResponse response) {
 try {
  //查询文件列表
  List<DatumListVo> voList = datumListService.queryDatumLists(datumListVo);

  //压缩文件
  List<File> files = new ArrayList<>();
  for (DatumListVo vo : voList) {
   File file = new File(vo.getDatumUrl());
   files.add(file);
  }

  String fileName = datumListVo.getOrderCode() + "_" + datumListVo.getDatumType() + ".zip";
  //在服务器端创建打包下载的临时文件
  String globalUploadPath = "";
  String osName = System.getProperty("os.name");
  if (osName.toLowerCase().indexOf("windows") >= 0) {
   globalUploadPath = GlobalKeys.getString(GlobalKeys.WINDOWS_UPLOAD_PATH);
  } else if (osName.toLowerCase().indexOf("linux") >= 0 || osName.toLowerCase().indexOf("mac") >= 0) {
   globalUploadPath = GlobalKeys.getString(GlobalKeys.LINUX_UPLOAD_PATH);
  }
  String outFilePath = globalUploadPath + File.separator + fileName;
  File file = new File(outFilePath);
  //文件输出流
  FileOutputStream outStream = new FileOutputStream(file);
  //压缩流
  ZipOutputStream toClient = new ZipOutputStream(outStream);
  //设置压缩文件内的字符编码,不然会变成乱码
  toClient.setEncoding("GBK");
  ZipUtil.zipFile(files, toClient);
  toClient.close();
  outStream.close();
  ZipUtil.downloadZip(file, response);

 } catch (Exception e) {
  e.printStackTrace();
 }
}

其中ZipUtil.java

/**
 * 压缩文件列表中的文件
 *
 * @param files
 * @param outputStream
 * @throws IOException
 */
public static void zipFile(List files, ZipOutputStream outputStream) throws IOException, ServletException {
 try {
  int size = files.size();
  //压缩列表中的文件
  for (int i = 0; i < size; i++) {
   File file = (File) files.get(i);
   try {
    zipFile(file, outputStream);
   } catch (Exception e) {
    continue;
   }
  }
 } catch (Exception e) {
  throw e;
 }
}

/**
 * 将文件写入到zip文件中
 *
 * @param inputFile
 * @param outputstream
 * @throws Exception
 */
public static void zipFile(File inputFile, ZipOutputStream outputstream) throws IOException, ServletException {
 try {
  if (inputFile.exists()) {
   if (inputFile.isFile()) {
    FileInputStream inStream = new FileInputStream(inputFile);
    BufferedInputStream bInStream = new BufferedInputStream(inStream);
    ZipEntry entry = new ZipEntry(inputFile.getName());
    outputstream.putNextEntry(entry);

    final int MAX_BYTE = 10 * 1024 * 1024; //最大的流为10M
    long streamTotal = 0;      //接受流的容量
    int streamNum = 0;      //流需要分开的数量
    int leaveByte = 0;      //文件剩下的字符数
    byte[] inOutbyte;       //byte数组接受文件的数据

    streamTotal = bInStream.available();      //通过available方法取得流的最大字符数
    streamNum = (int) Math.floor(streamTotal / MAX_BYTE); //取得流文件需要分开的数量
    leaveByte = (int) streamTotal % MAX_BYTE;    //分开文件之后,剩余的数量

    if (streamNum > 0) {
     for (int j = 0; j < streamNum; ++j) {
      inOutbyte = new byte[MAX_BYTE];
      //读入流,保存在byte数组
      bInStream.read(inOutbyte, 0, MAX_BYTE);
      outputstream.write(inOutbyte, 0, MAX_BYTE); //写出流
     }
    }
    //写出剩下的流数据
    inOutbyte = new byte[leaveByte];
    bInStream.read(inOutbyte, 0, leaveByte);
    outputstream.write(inOutbyte);
    outputstream.closeEntry();  //Closes the current ZIP entry and positions the stream for writing the next entry
    bInStream.close(); //关闭
    inStream.close();
   }
  } else {
   throw new ServletException("文件不存在!");
  }
 } catch (IOException e) {
  throw e;
 }
}

/**
 * 下载打包的文件
 *
 * @param file
 * @param response
 */
public static void downloadZip(File file, HttpServletResponse response) {
 try {
  // 以流的形式下载文件。
  BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
  byte[] buffer = new byte[fis.available()];
  fis.read(buffer);
  fis.close();
  // 清空response
  response.reset();

  OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
  response.setContentType("application/octet-stream");
  response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
  toClient.write(buffer);
  toClient.flush();
  toClient.close();
  file.delete();  //将生成的服务器端文件删除
 } catch (IOException ex) {
  ex.printStackTrace();
 }
}

以上基本满足文件上传下载所需。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JAVA 根据Url把多文件打包成ZIP下载实例

    压缩文件代码工具类: public class UrlFilesToZip { private static final Logger logger = LoggerFactory.getLogger(UrlFilesToZip.class); //根据文件链接把文件下载下来并且转成字节码 public byte[] getImageFromURL(String urlPath) { byte[] data = null; InputStream is = null; HttpURLConnec

  • Java程序打包成带参数的jar文件实例代码

    这里我们通过Apache Commons CLI来完成目标功能,废话不多说直接上代码 所需的maven依赖 <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.4</version> </dependency> 这里我们贴出主类代码 Options opts = new Optio

  • Java实现多文件压缩打包的方法

    本文实例讲述了Java实现多文件压缩打包的方法.分享给大家供大家参考,具体如下: package com.biao.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.u

  • Java后台实现浏览器一键导出下载zip压缩包

    使用迭代器模式和组合模式实现浏览器一键导出下载为zip压缩包文件 由于项目需要,于是又想起之前看过的设计模式,于是便有了一键导出的想法. 思路简单明了.一步一步看下去就好. 1.创建组合对象 public abstract class FileComponent { /** * Description: 递归创建文件夹,或者文件 */ public void mkFile(){ throw new UnsupportedOperationException(); } /** * Descript

  • javaweb文件打包批量下载代码

    本文实例为大家分享了javaweb文件打包批量下载,供大家参考,具体内容如下 // 批量下载未批改作业 @RequestMapping(value = "/downloadAllHomework", method = RequestMethod.GET) public void downloadAllHomework(HttpSession httpSession, HttpServletRequest request, HttpServletResponse response, St

  • java浏览器文件打包下载过程解析

    最近,在项目中遇到了需要将一系列的图片打包下载的需求,借鉴了网上的一些通用方法,就顺便分享出来实现的方法,不太记得借鉴的是哪位兄弟的博客了,总之万分感谢,进入正题,实现打包下载的基本功能: 1.controller层代码: /** * 图片压缩打包 */ @RequestMapping(value = "/zipFile") public void compressionFile(HttpServletRequest request, HttpServletResponse respo

  • 把Java程序打包成jar文件包并执行的方法

    本文介绍了把Java程序打包成jar文件包并执行的方法,分享给大家,具体如下: 1.首先要确认自己写的程序有没有报错. 2.第一次我写的是Web Project到现在,我一直没有执行成功,所以最好创建的是java Project 打包步骤: 1.在项目上,右键,选择Export. 2.进入到下图界面,选择Java 下面的JAR file 3.选择项目,确认必要的文件是否选中,选择保存jar文件包的路径,如下图 4.完成步骤3之后,点击Next,进入如下图界面: 5.直接点Next,进入下面的界面

  • 详解Java Project项目打包成jar,并生成exe文件

    初衷: 工作中写一些辅助工作的小工具时,将其打成exe,方便使用 准备工作: Eclipse,jdk,net.sf.fjep.fatjar_0.0.32.jar,exe4j.exe 1 将项目打包成jar文件: 1.1 用Eclpise的Export功能生成jar(单纯生成jar包时推荐) 目录结构 右击项目,选择Export 只留java文件 默认next到finish,有两种处理方式 方式一:自动生成MANIFEST.MF(默认的) 方式二:自己写MANIFEST.MF(可以写一些自己想要的

  • JavaWeb实现多文件上传及zip打包下载

    本文实例为大家分享了javaweb多文件上传及zip打包下载的具体代码,供大家参考,具体内容如下 项目中经常会使用到文件上传及下载的功能.本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分. 首先明确一点: 无法通过页面的无刷新ajax请求,直接发下载.上传请求.上传和下载,均需要在整页请求的基础上实现.项目中一般通过构建form表单形式实现这一功能. 一.多文件上传 项目需求为实现多图片上传功能.参考测试了网上找到的众多插件方法后,决定选用Jquery原始

  • JavaWeb Servlet实现文件上传与下载功能实例

    目录 前言 项目准备 文件上传 前台页面 文件下载 资源准备 超链接下载 后台实现下载 总结 前言 在上网的时候我们常常遇到文件上传的情况,例如上传头像.上传资料等:当然除了上传,遇见下载的情况也很多,接下来看看我们 servlet 中怎么实现文件的上传和下载. 项目准备 idea:2020.1 jdk:1.8 tomcat:10 项目模板:java Enterprise–>Web Application 文件上传 文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保

  • 详解JavaWeb如何实现文件上传和下载功能

    目录 1. 文件传输原理及介绍 2. JavaWeb文件上传 2.1我们用一个新的方式创建项目 2.2 导包 2.3 实用类介绍 2.4 pom.xml导入需要的依赖 2.5 index.jsp 2.6 info.jsp 2.7 FileServlet 2.8 配置Servlet 2.9 测试结果 3. SpringMVC文件上传和下载 3.1 上传 3.2 下载 1. 文件传输原理及介绍 2. JavaWeb文件上传 2.1我们用一个新的方式创建项目 空项目会直接弹出框 把jdk版本设置好 点

  • JavaWeb实现简单文件上传功能

    本文实例为大家分享了JavaWeb实现简单文件上传的具体代码,供大家参考,具体内容如下 1.概述 通常浏览器上传的所有参数,我们可以通过request对象的getParameter , getParameterMap , getParameterValue 这三个方法拿到所有的请求参数,但有一种情况,当强求包含参数包含文件上传时, 这三个方法都失效,无法拿到参数,我们就需要request对象的getInputStream方法获取这些参数, 如何解析这个字节输入流呢?apache 软件基金会: 开

  • javaWeb实现简单文件上传

    本文实例为大家分享了javaWeb实现简单文件上传的具体代码,供大家参考,具体内容如下 1.先导入两个包:commons-fileupload-1.3.3.jar,commons-io-2.6.jar. 2.前端页面代码 <form action="upLoadfile.do" method="post"         enctype="multipart/form-data">         <input type=&qu

  • JavaWeb项目实现文件上传动态显示进度实例

    很久没有更新博客了,这段时间实在的忙的不可开交,项目马上就要上线了,要修补的东西太多了.当我在学习JavaWeb文件上传的时候,我就一直有一个疑问,网站上那些博客的图片是怎么上传的,因为当提交了表单之后网页就跳转了.后来我学习到了Ajax,我知道了浏览器可以异步的发送响应,这时我又有新的疑问,那就是在我上传一些文件的时候,那些网站的上传进度是怎么做到的,因为servlet直到上传完成之后才完成响应. 最近我们的项目中有一个地方中需要用到一个功能,当用户点击一个处理按钮时,前台会实时的显示后台处理

  • JavaWeb实现文件上传下载功能实例解析

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

  • JavaWeb实现文件上传下载功能实例详解

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 文件上传概述 1.文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2.文件上传对页面的要求 上传文件的要求比较多,需要记一下: 必须使用表单,而不能是超链接 表单的method必须是POST,而不能是GET 表单的enctype必须是multipart/form-data 在表单中添加file表单字段,即<input ty

  • JavaWeb文件上传下载功能示例解析

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 1. 上传简单示例 Jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&g

  • JavaWeb中struts2实现文件上传下载功能实例解析

    在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.

随机推荐