本文目錄一覽:
- 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
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/197591.html