扣丁学堂Java开发之JavaWeb实现多文件上传及zip打包下
在目前大多数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打包下载的全部内容,希望对大家的学习有所帮助,也希望大家多多支持扣丁学堂。