程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaEE完成前後台交互的文件上傳與下載

JavaEE完成前後台交互的文件上傳與下載

編輯:關於JAVA

JavaEE完成前後台交互的文件上傳與下載。本站提示廣大學習愛好者:(JavaEE完成前後台交互的文件上傳與下載)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaEE完成前後台交互的文件上傳與下載正文


起首為年夜家引見相干的技巧:
service辦法中的兩個主要參數。
ServletRequest – 用吸收用戶的要求,它的感化是:

  • 可獲得要求頭信息。
  • 可設置請要求的字符編碼。
  • 可取得用戶傳遞的參數。Post或get。
  • 可獲得長途(即拜訪者)的IP地址。
  • 可獲得輸出流,如用戶上傳文件、相片等。

它的一個子接口:javax.servlet.http.HttpServletRequest
ServletResponse – 用於向用戶前往數據。

  • 設置呼應類型- contentType
  • 設置編碼-setCharacterEncoding
  • 獲得輸入流。

它的一個子接口: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> 

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved