扣丁学堂Java培训Java 杂谈

扣丁学堂Java开发之JavaWeb实现多文件上传及zip打包下

2018-07-16  本文已影响2人  994d14631d16

  在目前大多数Java开发程序项目中经常会使用到文件上传及下载的功能,扣丁学堂Java培训为大家分享了JavaWeb多文件上传及zip打包下载的具体代码及多文件上传及批量打包下载功能,包括前台及后台部分,下面我们一起来看一下吧。

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

​  一、多文件上传

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

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

  

  

  上传资料

  有几点说明:

  1.form中enctype=”multipart/form-data”

  2.例中使用标签,构建submit

  2、JS部分

  varformData=newFormData($("#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("");

  varobj=document.getElementById('fileImage');

  obj.outerHTML=obj.outerHTML;

  refreshDatumList();

  showSuccessToast(result.message);

  }else{

  showWarningToast(result.message);

  }

  },

  error:function(){

  showErrorToast('请求失败!')

  }

  });

  以上有几点说明:

  1.varformData=newFormData($(“#uploadForm”)[0]);

  2.使用formData.append(“oderCode”,selfOrderCode);添加其他参数

  Java后台

  MultipartHttpServletRequestmRequest=(MultipartHttpServletRequest)request;

  Listfiles=mRequest.getFiles("fileImage");

  以上有几点说明:

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

  二、文件批量下载

  本项目中,需求为批量下载某一批次文件。使用zip在服务器压缩文件,之后将文件下载到客户机。

  网上查询,使用Java自带的文件输出类不能解决压缩文件中文件名乱码的问题。解决方法:使用ant.jar包,创建压缩文件时,可以设置文件的编码格式,文件名乱码的问题就解决了。

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

  

  

  

  

  批量下载

  JS部分

  //批量下载

  functionbatchDatumListDownLoad(){

  varparam={};

  param.datumType=$("#datumTypeQ").val();

  if(param.datumType==-1){

  param.datumType=null;//查询所有

  }

  param.orderCode=selfOrderCode;

  $("#uploadForminput[name=orderCode]").val(param.orderCode);

  $("#uploadForminput[name=datumType]").val(param.datumType);

  varform=$("#uploadForm")[0];

  form.action="order/datumList/batchDownLoadDatumList";

  form.method="post";

  form.submit();//表单提交

  }

  后台部分

  publicvoidbatchDownLoadDatumList(DatumListVodatumListVo,HttpServletResponseresponse){

  try{

  //查询文件列表

  ListvoList=datumListService.queryDatumLists(datumListVo);

  //压缩文件

  Listfiles=newArrayList<>();

  for(DatumListVovo:voList){

  Filefile=newFile(vo.getDatumUrl());

  files.add(file);

  }

  StringfileName=datumListVo.getOrderCode()+"_"+datumListVo.getDatumType()+".zip";

  //在服务器端创建打包下载的临时文件

  StringglobalUploadPath="";

  StringosName=System.getProperty("os.name");

  if(osName.toLowerCase().indexOf("windows")>=0){

  globalUploadPath=GlobalKeys.getString(GlobalKeys.WINDOWS_UPLOAD_PATH);

  }elseif(osName.toLowerCase().indexOf("linux")>=0||osName.toLowerCase().indexOf("mac")>=0){

  globalUploadPath=GlobalKeys.getString(GlobalKeys.LINUX_UPLOAD_PATH);

  }

  StringoutFilePath=globalUploadPath+File.separator+fileName;

  Filefile=newFile(outFilePath);

  //文件输出流

  FileOutputStreamoutStream=newFileOutputStream(file);

  //压缩流

  ZipOutputStreamtoClient=newZipOutputStream(outStream);

  //设置压缩文件内的字符编码,不然会变成乱码

  toClient.setEncoding("GBK");

  ZipUtil.zipFile(files,toClient);

  toClient.close();

  outStream.close();

  ZipUtil.downloadZip(file,response);

  }catch(Exceptione){

  e.printStackTrace();

  }

  }

  其中ZipUtil.java

  /**

  *压缩文件列表中的文件

  *

  *@paramfiles

  *@paramoutputStream

  *@throwsIOException

  */

  publicstaticvoidzipFile(Listfiles,ZipOutputStreamoutputStream)throwsIOException,ServletException{

  try{

  intsize=files.size();

  //压缩列表中的文件

  for(inti=0;i

  Filefile=(File)files.get(i);

  try{

  zipFile(file,outputStream);

  }catch(Exceptione){

  continue;

  }

  }

  }catch(Exceptione){

  throwe;

  }

  }

  /**

  *将文件写入到zip文件中

  *

  *@paraminputFile

  *@paramoutputstream

  *@throwsException

  */

  publicstaticvoidzipFile(FileinputFile,ZipOutputStreamoutputstream)throwsIOException,ServletException{

  try{

  if(inputFile.exists()){

  if(inputFile.isFile()){

  FileInputStreaminStream=newFileInputStream(inputFile);

  BufferedInputStreambInStream=newBufferedInputStream(inStream);

  ZipEntryentry=newZipEntry(inputFile.getName());

  outputstream.putNextEntry(entry);

  finalintMAX_BYTE=10*1024*1024;//最大的流为10M

  longstreamTotal=0;//接受流的容量

  intstreamNum=0;//流需要分开的数量

  intleaveByte=0;//文件剩下的字符数

  byte[]inOutbyte;//byte数组接受文件的数据

  streamTotal=bInStream.available();//通过available方法取得流的最大字符数

  streamNum=(int)Math.floor(streamTotal/MAX_BYTE);//取得流文件需要分开的数量

  leaveByte=(int)streamTotal%MAX_BYTE;//分开文件之后,剩余的数量

  if(streamNum>0){

  for(intj=0;j

  inOutbyte=newbyte[MAX_BYTE];

  //读入流,保存在byte数组

  bInStream.read(inOutbyte,0,MAX_BYTE);

  outputstream.write(inOutbyte,0,MAX_BYTE);//写出流

  }

  }

  //写出剩下的流数据

  inOutbyte=newbyte[leaveByte];

  bInStream.read(inOutbyte,0,leaveByte);

  outputstream.write(inOutbyte);

  outputstream.closeEntry();//ClosesthecurrentZIPentryandpositionsthestreamforwritingthenextentry

  bInStream.close();//关闭

  inStream.close();

  }

  }else{

  thrownewServletException("文件不存在!");

  }

  }catch(IOExceptione){

  throwe;

  }

  }

  /**

  *下载打包的文件

  *

  *@paramfile

  *@paramresponse

  */

  publicstaticvoiddownloadZip(Filefile,HttpServletResponseresponse){

  try{

  //以流的形式下载文件。

  BufferedInputStreamfis=newBufferedInputStream(newFileInputStream(file.getPath()));

  byte[]buffer=newbyte[fis.available()];

  fis.read(buffer);

  fis.close();

  //清空response

  response.reset();

  OutputStreamtoClient=newBufferedOutputStream(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(IOExceptionex){

  ex.printStackTrace();

  }

  }

  以上就是关于Java开发之JavaWeb实现多文件上传及zip打包下载的全部内容,希望对大家的学习有所帮助,也希望大家多多支持扣丁学堂。

上一篇下一篇

猜你喜欢

热点阅读