JavaEE完成前後台交互的文件上傳與下載。本站提示廣大學習愛好者:(JavaEE完成前後台交互的文件上傳與下載)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaEE完成前後台交互的文件上傳與下載正文
起首為年夜家引見相干的技巧:
service辦法中的兩個主要參數。
ServletRequest – 用吸收用戶的要求,它的感化是:
它的一個子接口:javax.servlet.http.HttpServletRequest
ServletResponse – 用於向用戶前往數據。
它的一個子接口:javax.servlet.http.HttpServletResponse
文件下載技巧:
文件下載技巧相當於文件上傳技巧絕對而言比擬簡略。我們以下載圖片為例:
圖片都是先閱讀再下載
1.前端代碼:
<span ><a href="img">查找文件夾上面的一切圖片</a><br/></span>
前台只須要一句話便可以弄定了。直接經由過程web.xml查找後台的法式
2.後台顯示代碼:
<span >public class ShowImg extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { <span > </span>doPost(request, response);//為了避免異常,將doGet和doPost銜接在一路 }</span> <span >public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter();</span> <pre name="code" class="html"><span >//<span > </span>調出Servletcontext,固然也能夠直接挪用---當逐個列出圖片的時刻須要文件的相對途徑</span>
ServletContext context =getServletContext();String path=context.getRealPath("/imgs");//找到該文件夾的相對途徑File file =new File(path); <span >//<span > </span>找到文件夾以後,列出一切圖片供用戶閱讀 String files[] =file.list(); for(String fn:files){</span> <pre name="code" class="html"><span >//一個個的全體顯示出來</span>
String img="<img src='imgs/"+fn+"'/>";
// out.print("<a href=imgs/'"+fn+"'>下載圖片</a>");String str="<a href='down?name=imgs/"+fn+"'>下載圖片</a>";//供給下載的超鏈接,傳參---傳文件名給用戶鏈接內容上面寫out.print(str);out.print(img+"<br/>");}}
3.文件的詳細下載
起首必需設置響應的協定。下載協定就須要設置響應的下載頭
<span > </span><span ><strong>response.setContentType("application/force-download"</strong>);//設置響應頭</span>
下載的時刻須要顯示以後圖片的文件名,須要早年台獲得,而且從下載取得以後寫到前台去
<span > <span > </span>OutputStream out=response.getOutputStream();//取得輸入流 String name=request.getParameter("name");//從客服端傳過去的參數名 int num=name.lastIndexOf("/"); String aa=name.substring(num+1); aa=URLEncoder.encode(aa, "UTF-8");//若是中文須要從新編碼 //System.out.println(aa); response.setHeader("Content-Disposition",<span >"<strong>attachment;filename</strong></span>='"+aa+"'");//獲得從那裡傳過去的文件名,以便於存儲的時刻為下載用戶名</span>
停止詳細的下載
<span > String filename=this.getServletContext().getRealPath(name);//取得相對途徑,傳文件名過去,同時傳了可以取得的相對途徑便可以停止讀可寫了 InputStream in=new FileInputStream(filename); byte[] b=new byte[1024]; int len=0; while((len=in.read(b))!=-1){ out.write(b, 0, len); }</span>
後果圖:
點擊以後的後果圖:
傳文件名紛歧樣
文件上傳技巧
文件上傳如果本身去寫會很費事,所以我們可以用他人的包,下載鏈接點擊翻開鏈接
表單:
客戶端發送HTTP必需應用multipart/form-data數據類型,表現復合數據類型。
即:<form enctype=“multipart/form-data”>
在表單中應用<input type=“file” name=“somename”/>html標簽。
須要的包:
Commons-fileupload.jar,焦點上傳文件對象都在這個包中。
commons-io.jar – 上傳文件所須要的包
詳解:
DiskFileItemFactory-創立監時文件目次,指是緩存區年夜小
ServletFileUpload用於解析HttpServletRequest。前往一組文件對象。
FileItem – 表現用戶上傳的每個文件對像。
重要流程:
File f = new File("F:/ex/temp");//指定暫時文件寄存地位
DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//暫時文件的年夜小和寄存地位
ServletFileUpload sf =new ServletFileUpload(ff);
List<FileItem> list=sf.parseRequest(request);//開端解析
for(FileItem it:list){//取得文件名。和用到uuid處理重名的成績
FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//寫的指定的文件夾中
}
1、前台代碼:
<span ><h2>上傳文件</h2> <form action="UpFile" method="post" <span >enctype="multipart/form-data"</span> >//必需要寫,否則後台沒方法去吸收數據 <!-- 必需添加這個enctype="multipart/form-data"--> File1<input type="file"<span > name</span>="file"/><br/> 請輸出稱號:<input type="text" <span >name</span>="desc"/><br/> File2<input type="file"<span > name</span>="file"/><br/> 請輸出稱號:<input type="text"<span > name</span>="desc"/><br/> <input type="submit" value="提交"/> </form></span>
2、後台代碼:
2-1起首創立一個基於硬盤的工場,用來寄存暫時文件
//指定暫時寄存地位 File f = new File("F:/ex/temp");//指定暫時文件寄存地位 DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//暫時文件的年夜小和寄存地位
2-2 創立一個用ServletFileUpload對象,而且設置文件年夜小,最年夜許可傳多年夜的文件
//創立用於解析的對象 ServletFileUpload sf =new ServletFileUpload(ff); sf.setFileSizeMax(1024*1024*10);//僅僅許可單個寄存地位最年夜值是 10M sf.setSizeMax(1024*1024*20);//一切文件的最年夜值是20M String path =this.getServletContext().getRealPath("/imgs"); System.out.println("存儲途徑:"+path);
2-3 開端解析對象
<span > </span>List<FileItem> list=sf.parseRequest(request);//取得早年台傳過去的一切信息,前台必需填寫enctype="multipart/form-data" for(FileItem it:list){ it0=it; //<span > </span>若是通俗表單對象--可以直接斷定出 if(it.isFormField()){//是通俗表單項,如 type=text外面name的值 String name=it.getString("utf-8"); System.out.println("根本表單項 name:"+name);//上面寫的說明的名字 }else{ <span > </span>// 這就是前台選擇的文件名 String name=it.getName();//詳細的文件途徑---相對途徑 // String str=it.getString();//文件外面的內容 // System.out.println("str"+str); String contenttype=it.getContentType(); Long size=it.getSize(); <span > </span>System.out.println(name+","+contenttype+","+size); <pre name="code" class="html" >//<span > </span>在辦事器真個資本文件名不克不及用中文,閱讀器會主動編碼-------必需要把用戶上傳的文件名轉成沒有中文的名字存儲, //為了讓用戶鄙人載時能復原出本來的名字,就要把原文件名和映照名的對應關系存儲起來,在用戶下載時再轉換回來
//映照名String id=UUID.randomUUID().toString().replace("-", "");//全球獨一UUId來停止//文件名String lastname=name.substring(name.lastIndexOf("."));//文件格局//名字文件格局都找到了---組合String filename =id+lastname;//新的文件名//拷貝流。讓它寫到響應地位FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//path為存儲的相對途徑--之前界說的}
如許能完成簡略的上傳,然則,這類上傳是沒有一點平安行了。完全的代碼中附上了防普通的小成績照樣沒成績的
選擇文件以後
檢查web辦事器img外面的文件,文件曾經上傳到該頁面《文件名為uuid生成的文件名》
文件上傳源代碼:
<span >package cn.hncu.UPfile;import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.Writer; import java.util.List; import java.util.UUID; import javax.servlet.ServletException; 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; import org.apache.commons.io.FileUtils; public class MyupFile extends HttpServlet { <span > </span>//doGET避免有人在用戶欄輸出地址。沒有呼應 <span > </span>@Override <span > </span>protected void doGet(HttpServletRequest req, HttpServletResponse resp) <span > </span>throws ServletException, IOException { <span > </span>resp.setContentType("utf-8"); <span > </span>Writer wr=resp.getWriter(); <span > </span>wr.write("暫不支撐該上傳方法"); <span > </span>} <span > </span> <span > </span>public void doPost(HttpServletRequest request, HttpServletResponse response) <span > </span>throws ServletException, IOException { <span > </span>request.setCharacterEncoding("utf-8"); <span > </span>response.setContentType("text/html;charset=utf-8"); <span > </span>PrintWriter out=response.getWriter(); <span > </span>//防護 以通俗表單上傳 法一: <span > </span>//前往值 GET (null) POST1(apllication/x-form-urlencoded,通俗表單) POST2(file:multipart/form-data,文件上傳表單) //<span > </span>String type =request.getContentType(); //<span > </span>if(!type.contains("mulitpart/form-data")){ //<span > </span>out.write("不支撐通俗表單的上傳2"); //<span > </span>return ; //<span > </span>} <span > </span>// 法二 <span > </span>boolean boo=ServletFileUpload.isMultipartContent(request); <span > </span>if(boo==false){ <span > </span>out.print("不支撐通俗表單的上傳1"); <span > </span> <span > </span>} <span > </span> <span > </span>//指定暫時寄存地位 <span > </span>File f = new File("F:/ex/temp");//指定暫時文件寄存地位 <span > </span>DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//暫時文件的年夜小和寄存地位 <span > </span> <span > </span>//創立用於解析的對象 <span > </span>ServletFileUpload sf =new ServletFileUpload(ff); <span > </span>sf.setFileSizeMax(1024*1024*10);//僅僅許可單個寄存地位最年夜值是 10M <span > </span>sf.setSizeMax(1024*1024*20);//一切文件的最年夜值是20M <span > </span>String path =this.getServletContext().getRealPath("/imgs"); <span > </span>System.out.println("存儲途徑:"+path); <span > </span>//開端停止解析 <span > </span>FileItem it0=null;//用於在finally中停止刪除暫時文件 <span > </span>try { <span > </span>List<FileItem> list=sf.parseRequest(request);//取得早年台傳過去的一切信息,前台必需填寫enctype="multipart/form-data" <span > </span>for(FileItem it:list){ <span > </span>it0=it; <span > </span>if(it.isFormField()){//是通俗表單項,如 type=text外面name的值 <span > </span>String name=it.getString("utf-8"); <span > </span>System.out.println("根本表單項 name:"+name);//上面寫的說明的名字 <span > </span>}else{ <span > </span>String name=it.getName();//詳細的文件途徑 //<span > </span>String n1=it.getFieldName(); //<span > </span>String str=it.getString();//文件外面的內容 //<span > </span>System.out.println("str"+str); //<span > </span>System.out.println("n1:"+n1); <span > </span>String contenttype=it.getContentType(); <span > </span>Long size=it.getSize(); <span > </span>//避免文件為空 <span > </span>if(size==0){ <span > </span>continue;//文件為空,直接前往; <span > </span>} <span > </span>//用戶名。必需要填寫 <span > </span>if(name==null||name.trim()==""){ <span > </span>continue; <span > </span>} <span > </span>//<span > </span>System.out.println(name+","+contenttype+","+size); <span > </span>//在辦事器真個資本文件名不克不及用中文,閱讀器會主動編碼-------必需要把用戶上傳的文件名轉成沒有中文的名字存儲, <span > </span>//為了讓用戶鄙人載時能復原出本來的名字,就要把原文件名和映照名的對應關系存儲起來,在用戶下載時再轉換回來 <span > </span>//映照名 <span > </span>String id=UUID.randomUUID().toString().replace("-", ""); <span > </span>//文件名 <span > </span>String lastname=name.substring(name.lastIndexOf(".")); <span > </span>//名字文件格局都找到了---組合 <span > </span>String filename =id+lastname; <span > </span>//拷貝流。讓它寫到響應地位 <span > </span>FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));}<span > </span>}} catch (FileUploadException e) { <span > </span>throw new RuntimeException("文件上傳解析毛病。"+e); <span > </span>}finally{ <span > </span>if(it0==null){ <span > </span>it0.delete();//刪除暫時文件 <span > </span>}}out.close();}}</span><span > </span> 文件下載源代碼: [html] view plaincopyprint? <span >package cn.hncu.downImg; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownImgDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置響應頭 response.setContentType("application/force-download"); //給前台傳用戶名 /*傳固定的用戶名 String aa="1.jpg";//若是中文,須要編碼 aa=URLEncoder.encode(aa, "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename='"+aa+"'");////必需要加“attachment;”,不然會釀成閱讀 */ OutputStream out=response.getOutputStream();//取得輸入流 String name=request.getParameter("name");//從客服端傳過去的參數名 int num=name.lastIndexOf("/"); String aa=name.substring(num+1); aa=URLEncoder.encode(aa, "UTF-8");//若是中文須要從新編碼 //System.out.println(aa); response.setHeader("Content-Disposition","attachment;filename='"+aa+"'");//獲得從那裡傳過去的文件名,以便於存儲的時刻為下載用戶名 String filename=this.getServletContext().getRealPath(name);//取得相對途徑 InputStream in=new FileInputStream(filename); byte[] b=new byte[1024]; int len=0; while((len=in.read(b))!=-1){ out.write(b, 0, len);}}}</span><span > </span>
以上就是本文的全體內容,願望對年夜家的進修有所贊助。