本文目录一览:
- 1、Java Web如何实现远程下载
- 2、JavaWeb下载文件,怎么获取文件下载完毕的状态?
- 3、《JavaWeb开发实战1200例(第Ⅱ卷)》epub下载在线阅读,求百度网盘云资源
- 4、Javaweb中的文件下载实现
Java Web如何实现远程下载
在项目根路径中建一个文件夹比如Files专门存放文件,可以在webRoot中建此文件夹,然后你在前台写一个a标签,比如这样
a href=;下载/a
这样就可以了
JavaWeb下载文件,怎么获取文件下载完毕的状态?
在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为commons-fileupload依赖于commons-io这个包,所以需要下载这两个包commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar。
1、搭建环境
创建Web项目,将包导入到项目lib下
2、实现文件上传
(第一种上传的方法)
新建upload.jsp页面
?
12345678910111213141516
%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""htmlheadmeta http-equiv="Content-Type" content="text/html; charset=UTF-8"titleupload file/title/headbody !--这里的%=request.getContextPath()%是表示项目的绝对路径,也就是说不管你以后将项目拷贝到哪个位置,它都会找到准确的路径 -- form action="%=request.getContextPath()%/uploadServlet" enctype="multipart/form-data" method="post" span选择文件:/spaninput type="file" name="file1" input type="submit" value="上传" /form/body/html
新建处理文件上传的Servlet
?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
package com.load; import java.io.File;import java.io.IOException;import java.util.List;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;@WebServlet("/uploadServlet")public class uploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public uploadServlet() { super(); } /* fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象; * FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求 * (即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件 * */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通过isMultipartContent()方法:分析请求里面是不是有文件上的请求, boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart){ //创建可设置的磁盘节点工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //获取请求的上下文信息 ServletContext servletContext = request.getServletContext(); //缓存目录,每个服务器特定的目录 File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); //设置服务器的缓存目录 factory.setRepository(repository); //ServletFileUpload 对象的创建需要依赖于 FileItemFactory //工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。 ServletFileUpload upload = new ServletFileUpload(factory); try { //解析即被包装之后的 HttpServletRequest对象,既是分离文本表单和上传文件(http请求会被包装为HttpServletRequest) ListFileItem items = upload.parseRequest(request); for(FileItem item:items){ String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); //实例化一个文件 //request.getRealPath(获取真实路径) File file = new File(request.getRealPath("/")+"/loads"+fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length())); item.write(file); } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
(第二种上传的方法)
新建Jsp页面(同上,只是路径改变下)
?
12345678910111213141516
%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""htmlheadmeta http-equiv="Content-Type" content="text/html; charset=UTF-8"titleupload file/title/headbody !--这里的%=request.getContextPath()%是表示项目的绝对路径,也就是说不管你以后将项目拷贝到哪个位置,它都会找到准确的路径 -- form action="%=request.getContextPath()%/uploadservlet1" enctype="multipart/form-data" method="post" span选择文件:/spaninput type="file" name="file1" input type="submit" value="上传" /form/body/html
建立Servlet处理上传
?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
package com.load; import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;@WebServlet("/uploadservlet1")@MultipartConfig(location="")public class uploadservlet1 extends HttpServlet { private static final long serialVersionUID = 1L; public uploadservlet1() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); request.setCharacterEncoding("utf-8"); //取得上传文件,读取文件 Part part = request.getPart("file1"); //定义一个变量去接收文件名 String filename = null; //Content-Disposition: 就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名 //Content-Disposition:告诉浏览器以下载的方式打开文件 for (String content : part.getHeader("content-disposition").split(";")) { System.out.println(content); //取得文件名 if (content.trim().startsWith("filename")) { //截取文件名 filename = content.substring( content.indexOf('=') + 1).trim().replace("\"", ""); } } //输出流 OutputStream out = null; //输入流 InputStream filecontent = null; //File.separator 取得系统的分割线等数据 out = new FileOutputStream(new File("e:/loads" + File.separator + filename)); int read; //获得一个输入流 filecontent = part.getInputStream(); final byte[] bytes = new byte[1024]; while ((read = filecontent.read(bytes)) != -1) { out.write(bytes, 0, read); } System.out.println("New file " + filename + " created at " + "/loads"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
(第三种上传的方法)
这里使用的是jspSmartUpload包上传下载,笔者认为这种上传下载较为简单,但是好像不是很多人用,不懂。
创建HTML页面
?
123456789101112131415161718192021222324252627
!DOCTYPE htmlhtmlheadmeta http-equiv="Content-Type" content="text/html; charset=UTF-8"title上传文件/title/headbody p /p p align="center"上传文件选择/p form method="post" Action="../DouploadServlet" enctype="multipart/form-data" table width="75%" border="1" align="center" trtddiv align="center" 1.input type="file" name="file1" /div/td/tr trtddiv align="center" 2.input type="file" name="file2" /div/td/tr trtddiv align="center" 3.input type="file" name="file3" /div/td/tr trtddiv align="center" input type="submit" name="Submit" value="上传他" /div/td/tr /table /form/body/html
创建Servlet处理上传文件
?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
package com.load; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspFactory;import javax.servlet.jsp.PageContext; import com.jspsmart.upload.File;import com.jspsmart.upload.SmartUpload;import com.jspsmart.upload.SmartUploadException;@WebServlet("/DouploadServlet")public class DouploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public DouploadServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //新建一个智能上传对象 SmartUpload su = new SmartUpload(); /* * PageContext pageContext; HttpSession session; ServletContext application; ServletConfig config; JspWriter out; Object page = this; HttpServletRequest request, HttpServletResponse response 其中page对象,request和response已经完成了实例化,而其它5个没有实例化的对象通过下面的方式实例化 pageContext = jspxFactory.getPageContext(this, request, response,null, true, 8192, true); */ //通过Jsp工厂类获取上下文环境 PageContext pagecontext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8192, true); //上传初始化 su.initialize(pagecontext); //上传文件 try { su.upload(); //将上传文件保存到指定目录 int count = su.save("/share"); out.println(count+"个文件上传成功!br"+su.toString()); } catch (SmartUploadException e) { e.printStackTrace(); } //逐个提取上传文件信息 for(int i=0;isu.getFiles().getCount();i++){ File file = su.getFiles().getFile(i); //如果文件不存在 if(file.isMissing()) continue; //显示当前文件信息 out.println("table border=1"); out.println("trtd表单项名(FieldName)/td/td"+file.getFieldName()+"/td/tr"); out.println("trtd文件长度/tdtd"+file.getSize()+"/td/tr"); out.println("trtd文件名/tdtd"+file.getFileName()+"/td/tr"); out.println("trtd文件扩展名/tdtd"+file.getFileExt()+"/td/tr"); out.println("trtd文件全名/tdtd"+file.getFilePathName()+"/td/tr"); out.println("/tablebr"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
注意:代码 int count = su.save("/share");表示你需要先建个文件夹,所以你可以先在Webcontent建立一个,然后将项目取消部署,再重新部署进去之后就会在运行那边建立起一个文件夹了!
或者你可以直接找到运行的路径,然后建立share文件夹。
3、实现文件下载
(第一种文件下载)
注意:该代码是直接访问Servlet类的
?
123456789101112131415161718192021222324252627282930313233343536373839404142
package com.load; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; //直接使用进行下载,但是这个有缺陷,如果下载文件名中有中文,就会变成乱码现象!@WebServlet("/download")public class download extends HttpServlet { private static final long serialVersionUID = 1L; public download() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain;charset=utf-8"); response.setCharacterEncoding("utf-8"); response.setHeader("Location","中文.txt"); response.setHeader("Content-Disposition", "attachment; filename=" + "账号.txt"); OutputStream outputStream = response.getOutputStream(); InputStream inputStream = new FileInputStream("E:/loads"+"/账号.txt"); byte[] buffer = new byte[1024]; int i = -1; while ((i = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, i); } outputStream.flush(); outputStream.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
(第二种下载方法)
新建jsp页面选择下载
%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ""htmlheadmeta http-equiv="Content-Type" content="text/html; charset=UTF-8"title下载/title/headbody a href="../DoDownloadServlet?filename=呵呵.txt"点击下载/a/body/html
创建Servlet类进行下载(注意:该下载如果文件名是中文的话,一样会出现乱码现象)
package com.load;
import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URLEncoder; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspFactory;import javax.servlet.jsp.PageContext; import org.hsqldb.lib.StringUtil; import com.jspsmart.upload.SmartUpload;import com.jspsmart.upload.SmartUploadException; @WebServlet("/DoDownloadServlet")public class DoDownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public DoDownloadServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到下载文件的名称 //String filename = request.getParameter("filename"); //String filename = new String(FileName.getBytes("iso8859-1"),"UTF-8"); //新建SmartUpload对象 SmartUpload su = new SmartUpload(); PageContext pagecontext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8192, true); //上传初始化 su.initialize(pagecontext); //设置禁止打开该文件 su.setContentDisposition(null); //下载文件 try { su.downloadFile("/listener/"+filename); } catch (SmartUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
(第三种下载的方法)
同上的jsp页面代码,这里就不再重复了。
新建Serlvet类,实现下载功能(注意:这里文件名就算是中文名,也不会出现乱码问题了!)
package com.load;
import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URLEncoder; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspFactory;import javax.servlet.jsp.PageContext; import org.hsqldb.lib.StringUtil; import com.jspsmart.upload.SmartUpload;import com.jspsmart.upload.SmartUploadException; @WebServlet("/DoDownloadServlet")public class DoDownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public DoDownloadServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得文件名称 String path1 = request.getParameter("filename"); //获得路径名称 String path = request.getSession().getServletContext().getRealPath("/listener/"+path1); // path是根据日志路径和文件名拼接出来的 File file = new File(path); String filename = file.getName(); try { //判断是否是IE11 Boolean flag= request.getHeader("User-Agent").indexOf("like Gecko")0; //IE11 User-Agent字符串:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko //IE6~IE10版本的User-Agent字符串:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.0; Trident/6.0) if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") 0||flag){ filename = URLEncoder.encode(filename, "UTF-8");//IE浏览器 }else { //先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码, //这个文件名称用于浏览器的下载框中自动显示的文件名 filename = new String(filename.replaceAll(" ", "").getBytes("UTF-8"), "ISO8859-1"); //firefox浏览器 //firefox浏览器User-Agent字符串: //Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0 } InputStream fis = new BufferedInputStream(new FileInputStream(path)); byte[] buffer; buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); response.reset(); response.addHeader("Content-Disposition", "attachment;filename=" +filename); response.addHeader("Content-Length", "" + file.length()); OutputStream os = response.getOutputStream(); response.setContentType("application/octet-stream"); os.write(buffer);// 输出文件 os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println(filename); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
《JavaWeb开发实战1200例(第Ⅱ卷)》epub下载在线阅读,求百度网盘云资源
《Java Web开发实战1200例(第Ⅰ卷)》(卢瀚//王春斌)电子书网盘下载免费在线阅读
资源链接:
链接:
密码:m01y
书名:Java Web开发实战1200例(第Ⅰ卷)
作者:卢瀚//王春斌
出版社:清华大学
出版年份:2011-1
页数:909
内容简介:
《Java Web开发实战1200例(第1卷)》简介:《Java Web开发实战1200例》包括第I卷、第II卷共计1200个例子,《Java Web开发实战1200例(第1卷)》是第I卷,共计600个例子。
《Java Web开发实战1200例(第1卷)》以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java Web进行程序开发的各个方面的知识和技巧,主要包括Java Web编程基础、文件操作管理、图形图像与多媒体技术、窗体应用技术、JSP操作Word与Excel等。全书分6篇23章,共计600个实例和600个经验技巧。每个实例都是经过作者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。
《Java Web开发实战1200例》两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;本书实例来源于多位工程师的多年积累,具有很强的实用性。
《Java Web开发实战1200例(第1卷)》附带有配套DVD光盘,光盘中提供有部分实例的视频和大部分源代码,读者稍加修改即可应用。
《Java Web开发实战1200例(第1卷)》适合Java Web的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java Web程序员参考、查阅。
Javaweb中的文件下载实现
需要在响应头部加上一些标示,告诉浏览器这个是文件下载。
如果你用了框架比如struts,需要加如下配置
result name="success" type="stream"
param name="contentType"application/octet-stream;charset=ISO8859-1/param
param name="inputName"fileStream/param
param name="contentDisposition"attachment;filename="${fileName}"/param
param name="bufferSize"2048/param
/result
如果没有用框架,就手动在返回对象添加这些contentType