通过实例了解如何在JavaWeb实现文件下载
文件下载的方式
- 超链接下载
- 后台实现下载
案例实操
超链接下载
当我们在HTML或JSP页面中使用标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的动态网页时则会自动下载。如果浏览器遇到能够直接显示的资源,浏览器就会默认显示出来,比如txt,png,jpg等。当然我们也可以通过download属性规定浏览器进行下载。但有些浏览器并不支持。
默认下载
指定download属性下载
这里,download也可以不写任何信息,会自动使用默认文件名。这样当用户打开浏览器点击链接的时候就会直接下载文件。
后台实现下载
Step1:需要通过HttpServletResponse.setContentType方法设置Content-type头字段的值,这样浏览器才能够使用某种方式或激活某个程序来处理相应MIME类型的数据,例如”application/octet-stream”或”application/x-msdownload”等
Step2:需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为”attachment;filename=文件名”,filename提供了文件下载时的一个默认文件名
Step3:读取下载文件,调用HttpServletResponse.getOutputStream方法返回的OutputStream对象来向客户端写入附件内容。
publicclassDownLoadServletextendsHttpServlet{ privatestaticfinallongserialVersionUID=1L; protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ //设置请求编码 request.setCharacterEncoding("UTF-8"); //接受参数,得到需要被下载的文件的名称 StringfileName=request.getParameter("fileName"); //判断名字名是否为空 if(fileName==null||"".equals(fileName)){ //提示 System.out.println("文件名不能为空"); return; } //获取文件存放的真实路径 Stringpath=request.getServletContext().getRealPath("/"+fileName); //通过文件路径和文件名得到file对象 Filefile=newFile(path); //判断是否存在,并且是一个标准文件 if(file.exists()&&file.isFile()){ //设置相应类型application/octet-stream response.setContentType("application/x-msdownload"); //设置头信息 response.setHeader("Content-Disposition","attachment;filename="+fileName); //通过file对象得到输入流 FileInputStreamin=newFileInputStream(file); //得到输出流 ServletOutputStreamout=response.getOutputStream(); byte[]car=newbyte[1024]; intlen=0; while((len=in.read(car))!=-1){ out.write(car,0,len); } //关闭流 in.close(); out.close(); }else{ System.out.println("文件路径不正确!"); } } }
扩展~HTML表单编码
HTML表单编码
enctype属性指定浏览器如何编码数据并将其呈现给服务器。
此属性有三个允许值。
application/x-www-form-urlencoded
默认编码。
此编码无法用于将文件上传到服务器。
multipart/form-data
此编码用于将文件上传到服务器。
text/plain
此编码因浏览器而异。
要理解不同编码的工作原理,我们创建了以下形式。
application/x-www-form-urlencoded
如果使用application/x-www-form-urlencoded编码,每个数据项的名称和值都使用用于编码URL的相同方案进行编码。这是编码应用于示例形式的数据的方式:
fave=Apples&name=FiratName+LastName
特殊字符将替换为其HTML实体对应部分。数据项的名称和值由等号(=)分隔,数据/值元组由&符号(&)分隔。
multipart/form-data
multipart/form-data编码往往仅用于上传文件。下面是示例表单中的数据如何编码:
------WebKitFormBoundary2desQWER543CDFGF
Content-Disposition:form-data;name="fave"YourName
------WebKitFormBoundary2desQWER543CDFGFContent-Disposition:form-data;name="name"www.lezijie.cn
------WebKitFormBoundary2desQWER543CDFGF--fave=Apple
name=www.lezijie.cn
multipart/plain
主流浏览器以不同的方式对该编码进行编码。
GoogleChrome以与application/x-www-form-urlencoded方案相同的方式对数据进行编码,而Firefox对数据进行编码的方式如下:
fave=xml
name=www.lezijie.cn
每个数据项都放在一行上,不会对特殊字符进行编码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。