志在指尖
用双手敲打未来

java下载文件(java下载文件到本地方法)

java下载文件

需求
导出文件后存留在了服务器中,需要提供下载按钮,点击后可下载到本地;(因为涉及多个文件,下载前先将文件进行压缩,提供下载压缩文件)
效果预览
clipboard.png
代码
主要方法
/**
*下载生成的所有在线/离线用户信息表格
*@paramrequest
*@paramresponse
*@return压缩文件
*@throwsFTPConnectionClosedException
*@throwsIOException
*/
publicFiledownloadExcel(HttpServletRequestrequest,HttpServletResponseresponse)
throwsFTPConnectionClosedException,IOException{
//提供下载文件前进行压缩,即服务端生成压缩文件
Filefile=newFile(zipPath);
FileOutputStreamfos=newFileOutputStream(file);
ZipUtils.toZip(path,fos,true);
//1.获取要下载的文件的绝对路径
StringrealPath=zipPath;
//2.获取要下载的文件名
StringfileName=realPath.substring(realPath.lastIndexOf(File.separator)+1);
response.reset();
response.setCharacterEncoding(“UTF-8”);
response.setContentType(“application/octet-stream”);
//3.设置content-disposition响应头控制浏览器以下载的形式打开文件
response.addHeader(“Content-Disposition”,”attachment;filename=”+newString(fileName.getBytes(),”utf-8″));
//获取文件输入流
InputStreamin=newFileInputStream(realPath);
intlen=0;
byte[]buffer=newbyte[1024];
OutputStreamout=response.getOutputStream();
while((len=in.read(buffer))>0){
//将缓冲区的数据输出到客户端浏览器
out.write(buffer,0,len);
}
in.close();
returnfile;
}
压缩方法[1]
publicstaticvoidtoZip(StringsrcDir,OutputStreamout,booleanKeepDirStructure)
throwsRuntimeException{
longstart=System.currentTimeMillis();
ZipOutputStreamzos=null;
try{
zos=newZipOutputStream(out);
FilesourceFile=newFile(srcDir);
compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
longend=System.currentTimeMillis();
System.out.println(“压缩完成,耗时:”+(end-start)+”ms”);
}catch(Exceptione){
thrownewRuntimeException(“ziperrorfromZipUtils”,e);
}finally{
if(zos!=null){
try{
zos.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
*递归压缩方法
*@paramsourceFile源文件
*@paramzoszip输出流
*@paramname压缩后的名称
*@paramKeepDirStructure是否保留原来的目录结构,true:保留目录结构;
*false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
*@throwsException
*/
privatestaticvoidcompress(FilesourceFile,ZipOutputStreamzos,Stringname,
booleanKeepDirStructure)throwsException{
byte[]buf=newbyte[BUFFER_SIZE];
if(sourceFile.isFile()){
//向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
zos.putNextEntry(newZipEntry(name));
//copy文件到zip输出流中
intlen;
FileInputStreamin=newFileInputStream(sourceFile);
while((len=in.read(buf))!=-1){
zos.write(buf,0,len);
}
//Completetheentry
zos.closeEntry();
in.close();
}else{
File[]listFiles=sourceFile.listFiles();
if(listFiles==null||listFiles.length==0){
//需要保留原来的文件结构时,需要对空文件夹进行处理
if(KeepDirStructure){
//空文件夹的处理
zos.putNextEntry(newZipEntry(name+”/”));
//没有文件,不需要文件的copy
zos.closeEntry();
}
}else{
for(Filefile:listFiles){
//判断是否需要保留原来的文件结构
if(KeepDirStructure){
//注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
//不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
compress(file,zos,name+”/”+file.getName(),KeepDirStructure);
}else{
compress(file,zos,file.getName(),KeepDirStructure);
}
}
}
}
}
SpringMVC
@Download
@Path(“downloadExcel”)
publicFileDownloadExcel(HttpServletRequestrequest,HttpServletResponseresponse)throwsFTPConnectionClosedException,IOException{
Filefile=exportXMPPUserInfo.downloadExcel(request,response);
returnfile;
}
前端
公司内部写法,理解其中含义即可。

<inputid=”downloadExcel”type=”submit”value=”下载”/>

<script>

//下载excel
W.$(‘downloadExcel’).on(‘click’,function(e){
W.download(‘userLoginService/downloadExcel’);
/*W.get(‘userLoginService/downloadExcel’).done(function(result){
console.log(“下载用户信息表”);
});*/
});

</script>java

java下载文件到本地方法

有一个链接如下:
点击链接下载文件:
第一种办法:Servlet完成
一、HTML页面部分:
1、HTML页面中的一个链接
下载导入模板
2、引进JS
仿制代码
functiondownload(){
downloadTemplate(‘downloadExel.downloadexcel’,’filename’,’project’);
}/**
*用于下载导入模板时的影藏form表单的提交,采用post方式提交
*@paramactionaction映射地址
*@paramtypeparameter的名称
*@paramvalueparameter的值,这儿为file的filename*/functiondownloadTemplate(action,type,value){varform=document.createElement(‘form’);
document.body.appendChild(form);
form.style.display=”none”;
form.action=action;
form.id=’excel’;
form.method=’post’;varnewElement=document.createElement(“input”);
newElement.setAttribute(“type”,”hidden”);
newElement.name=type;
newElement.value=value;
form.appendChild(newElement);
form.submit();
}
3、解说上面JS(不是正是代码)
相当于提交一个form,里面如下:
“filename”value=”project”>
后台能够经过下面代码取得文件名:project
Stringfilename=request.getParameter(“filename”);
(这段是上面js的翻译,不是正式的哦)
二、装备部分
装备前台页面和后台交互
1、web.xml装备
“1.0”encoding=”UTF-8″?>
“WebApp_ID”version=”2.4″xmlns=”http://java.sun.com/xml/ns/j2ee”xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”xsi:schemaLocation=”http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>downloadServletclass>com.zit.rfid.app.prms.business.service.servlet.DownloadTemplateServletclass>3downloadServlet*.downloadexcel
我这个web.xml不是整个工程的web.xml,仅仅一个模块的,在你的web.xml参加上面servlet和servlet-mapping里的内容即可
如上:
(1)承受*.downloadexcel的Action
(2)HTML的JS里的Action,交给com.test.DownloadTemplateServlet这个类去处理
2、WebContent目录下新建file文件夹,存放project.xls文件(Eclipse的Web工程有WebContent,MyEclipse好像是WebRoot)
三、后台部分
1、新建一个servlet:
DownloadTemplateServlet.java
packagecom.test;
importjava.io.DataInputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.io.OutputStreamWriter;
importjava.net.URLEncoder;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;/**
*@author0223000218
*首要用于下载导入模板,页面上传入的request中parameter中,filename代表了要下载的模板的名称*/publicclassDownloadTemplateServletextendsHttpServlet{/**
*serialVersionUID*/privatestaticfinallongserialVersionUID=-4541729035831587727L;privatefinalstaticStringHOME_PATH=DownloadTemplateServlet.class.getResource(“/”).getPath();privatefinalstaticStringDOWNLOAD_TEMP_FILE=HOME_PATH.subSequence(0,HOME_PATH.indexOf(“WEB-INF”))+”file/”;
@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
doPost(req,resp);
}
@OverrideprotectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
Stringfilename=req.getParameter(“filename”);try{
resp.reset();//清空输出流StringresultFileName=filename+System.currentTimeMillis()+”.xls”;
resultFileName=URLEncoder.encode(resultFileName,”UTF-8″);
resp.setCharacterEncoding(“UTF-8”);
resp.setHeader(“Content-disposition”,”attachment;filename=”+resultFileName);//设定输出文件头resp.setContentType(“application/msexcel”);//界说输出类型//输入流:本地文件途径DataInputStreamin=newDataInputStream(newFileInputStream(newFile(DOWNLOAD_TEMP_FILE+filename+”.xls”)));//输出流OutputStreamout=resp.getOutputStream();//输出文件intbytes=0;byte[]bufferOut=newbyte[1024];while((bytes=in.read(bufferOut))!=-1){out.write(bufferOut,0,bytes);
}out.close();in.close();
}catch(Exceptione){
e.printStackTrace();
resp.reset();try{
OutputStreamWriterwriter=newOutputStreamWriter(resp.getOutputStream(),”UTF-8″);
Stringdata=””;
writer.write(data);
writer.close();
}catch(IOExceptione1){
e1.printStackTrace();
}
}
}
}
大致过程:
1.获取服务器文件所在途径
2.输入服务器文件
3.输出文件到本地
第二种办法:SpringMVC完成
这种办法比较简单
一、JSP页面部分
和上面相同
“downloadTemplate”style=”color:blue”onclick=”download();”>下载导入模板
//导出模板下载functiondownload(){//后台办法、文件类型、文件名downloadTemplate(‘${pageContext.request.contextPath}/cardIssueVehicleInfo/exportVehicleInfo’,’filename’,’test’);
}/**
*用于下载导入模板时的影藏form表单的提交,采用post方式提交
*@paramaction请求后台办法
*@paramtype文件类型
*@paramvalue文件名*/functiondownloadTemplate(action,type,value){varform=document.createElement(‘form’);
document.body.appendChild(form);
form.style.display=”none”;
form.action=action;
form.id=’excel’;
form.method=’post’;varnewElement=document.createElement(“input”);
newElement.setAttribute(“type”,”hidden”);
newElement.name=type;
newElement.value=value;
form.appendChild(newElement);
form.submit();
二、后台部分
@RequestMapping(“exportVehicleInfo”)publicvoidexportVehicleInfo(HttpServletRequestreq,HttpServletResponseresp){
Stringfilename=req.getParameter(“filename”);
DataInputStreamin=null;
OutputStreamout=null;try{
resp.reset();//清空输出流StringresultFileName=filename+System.currentTimeMillis()+”.xls”;
resultFileName=URLEncoder.encode(resultFileName,”UTF-8″);
resp.setCharacterEncoding(“UTF-8”);
resp.setHeader(“Content-disposition”,”attachment;filename=”+resultFileName);//设定输出文件头resp.setContentType(“application/msexcel”);//界说输出类型//输入流:本地文件途径in=newDataInputStream(newFileInputStream(newFile(downloadPath+”test.xls”)));//输出流out=resp.getOutputStream();//输出文件intbytes=0;byte[]bufferOut=newbyte[1024];while((bytes=in.read(bufferOut))!=-1){out.write(bufferOut,0,bytes);
}
}catch(Exceptione){
e.printStackTrace();
resp.reset();try{
OutputStreamWriterwriter=newOutputStreamWriter(resp.getOutputStream(),”UTF-8″);
Stringdata=””;
writer.write(data);
writer.close();
}catch(IOExceptione1){
e1.printStackTrace();
}
}finally{if(null!=in){try{in.close();
}catch(IOExceptione){
e.printStackTrace();
}
}if(null!=out){try{out.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}

未经允许不得转载:IT技术网站 » java下载文件(java下载文件到本地方法)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载