最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaEE實現(xiàn)前后臺交互的文件上傳與下載

 更新時間:2015年11月13日 09:18:58   投稿:lijiao  
這篇文章主要介紹了JavaEE實現(xiàn)前后臺交互的文件上傳與下載,分享相關(guān)技術(shù),實現(xiàn)文件上傳下載功能,需要的朋友可以參考下

首先為大家介紹相關(guān)的技術(shù)
service方法中的兩個重要參數(shù)。
ServletRequest – 用接收用戶的請求,它的作用是:

  • 可獲取請求頭信息。
  • 可設(shè)置請請求的字符編碼。
  • 可獲得用戶傳遞的參數(shù)。Post或get。
  • 可獲取遠程(即訪問者)的IP地址。
  • 可獲取輸入流,如用戶上傳文件、相片等。

它的一個子接口:javax.servlet.http.HttpServletRequest
ServletResponse – 用于向用戶返回數(shù)據(jù)。

  • 設(shè)置響應(yīng)類型- contentType
  • 設(shè)置編碼-setCharacterEncoding
  • 獲取輸出流。

它的一個子接口:javax.servlet.http.HttpServletResponse
文件下載技術(shù):
文件下載技術(shù)相當(dāng)于文件上傳技術(shù)相對而言比較簡單。我們以下載圖片為例:
圖片都是先瀏覽再下載
1.前端代碼:

<span style="font-size:14px;"><a href="img">查找文件夾下面的所有圖片</a><br/></span> 

前臺只需要一句話就可以搞定了。直接通過web.xml查找后臺的程序
2.后臺顯示代碼:

<span style="font-size:14px;">public class ShowImg extends HttpServlet { 
 public void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException { 
<span style="white-space:pre"> </span>doPost(request, response);//為了防止異常,將doGet和doPost連接在一起 
 }</span> 
 
<span style="font-size:14px;">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 style="font-size:14px;">//<span style="white-space:pre">  </span>調(diào)出Servletcontext,當(dāng)然也可以直接調(diào)用---當(dāng)一一列出圖片的時候需要文件的絕對路徑</span> 
ServletContext context =getServletContext();String path=context.getRealPath("/imgs");//找到該文件夾的絕對路徑File file =new File(path);
 
<span style="font-size:14px;">//<span style="white-space:pre">  </span>找到文件夾之后,列出所有圖片供用戶瀏覽 
  String files[] =file.list(); 
  for(String fn:files){</span> 
 
<pre name="code" class="html"><span style="font-size:14px;">//一個個的全部顯示出來</span> 

String img="<img src='imgs/"+fn+"'/>";
// out.print("<a href=imgs/'"+fn+"'>下載圖片</a>");String str="<a href='down?name=imgs/"+fn+"'>下載圖片</a>";//提供下載的超鏈接,傳參---傳文件名給用戶鏈接內(nèi)容下面寫out.print(str);out.print(img+"<br/>");}}

3.文件的具體下載
首先必須設(shè)置相應(yīng)的協(xié)議。下載協(xié)議就需要設(shè)置相應(yīng)的下載頭

<span style="white-space:pre"> </span><span style="font-size:18px;"><strong>response.setContentType("application/force-download"</strong>);//設(shè)置相應(yīng)頭</span> 

下載的時候需要顯示當(dāng)前圖片的文件名,需要從前臺獲取,并且從下載獲得之后寫到前臺去

<span style="font-size:18px;"> <span style="white-space:pre"> </span>OutputStream out=response.getOutputStream();//獲得輸出流 
 String name=request.getParameter("name");//從客服端傳過來的參數(shù)名 
 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 style="color:#ff0000;">"<strong>attachment;filename</strong></span>='"+aa+"'");//獲取從那邊傳過來的文件名,以便于存儲的時候為下載用戶名</span> 

 進行具體的下載

<span style="font-size:18px;"> 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> 

效果圖:


點擊之后的效果圖:

傳文件名不一樣

文件上傳技術(shù)
文件上傳要是自己去寫會很麻煩,所以我們可以用別人的包,下載鏈接點擊打開鏈接
表單:

客戶端發(fā)送HTTP必須使用multipart/form-data數(shù)據(jù)類型,表示復(fù)合數(shù)據(jù)類型。

即:<form enctype=“multipart/form-data”>

在表單中使用<input type=“file” name=“somename”/>html標(biāo)簽。

需要的包:

Commons-fileupload.jar,核心上傳文件工具都在這個包中。

commons-io.jar – 上傳文件所需要的包

詳解:
DiskFileItemFactory-創(chuàng)建監(jiān)時文件目錄,指是緩存區(qū)大小
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 style="font-size:18px;"><h2>上傳文件</h2> 
 <form action="UpFile" method="post" <span style="color:#ff0000;">enctype="multipart/form-data"</span> >//必須要寫,不然后臺沒辦法去接收數(shù)據(jù) 
 <!-- 必須添加這個enctype="multipart/form-data"--> 
 File1<input type="file"<span style="color:#ff6666;"> name</span>="file"/><br/> 
 請輸入名稱:<input type="text" <span style="color:#ff6666;">name</span>="desc"/><br/> 
 File2<input type="file"<span style="color:#ff6666;"> name</span>="file"/><br/> 
 請輸入名稱:<input type="text"<span style="color:#ff0000;"> name</span>="desc"/><br/> 
 <input type="submit" value="提交"/> 
 </form></span> 

2、后臺代碼:
2-1首先創(chuàng)建一個基于硬盤的工廠,用來存放臨時文件

//指定臨時存放位置 
File f = new File("F:/ex/temp");//指定臨時文件存放位置 
DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//臨時文件的大小和存放位置 

2-2 創(chuàng)建一個用ServletFileUpload對象,并且設(shè)置文件大小,最大允許傳多大的文件

//創(chuàng)建用于解析的對象 
 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 style="white-space:pre"> </span>List<FileItem> list=sf.parseRequest(request);//獲得從前臺傳過來的所有信息,前臺必須填寫enctype="multipart/form-data" 
  for(FileItem it:list){ 
  it0=it; 
//<span style="white-space:pre">  </span>若是普通表單對象--可以直接判斷出 
  if(it.isFormField()){//是普通表單項,如 type=text里面name的值 
   String name=it.getString("utf-8"); 
   System.out.println("基本表單項 name:"+name);//下面寫的解釋的名字 
  }else{ 
<span style="white-space:pre">  </span>// 這就是前臺選擇的文件名 
   String name=it.getName();//具體的文件路徑---絕對路徑 
//   String str=it.getString();//文件里面的內(nèi)容 
//   System.out.println("str"+str); 
   String contenttype=it.getContentType(); 
   Long size=it.getSize(); 
 <span style="white-space:pre">  </span>System.out.println(name+","+contenttype+","+size); 
<pre name="code" class="html" style="font-size: 18px;">//<span style="white-space:pre">   </span>在服務(wù)器端的資源文件名不能用中文,瀏覽器會自動編碼-------必須要把用戶上傳的文件名轉(zhuǎn)成沒有中文的名字存儲, 
   //為了讓用戶在下載時能還原出原來的名字,就要把原文件名和映射名的對應(yīng)關(guān)系存儲起來,在用戶下載時再轉(zhuǎn)換回來 

 //映射名String id=UUID.randomUUID().toString().replace("-", "");//全球唯一UUId來進行//文件名String lastname=name.substring(name.lastIndexOf("."));//文件格式//名字文件格式都找到了---組合String filename =id+lastname;//新的文件名//拷貝流。讓它寫到相應(yīng)位置FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));//path為存儲的絕對路徑--之前定義的}
這樣能實現(xiàn)簡單的上傳,但是,這種上傳是沒有一點安全行了。完整的代碼中附上了防一般的小問題還是沒問題的

選擇文件之后

查看web服務(wù)器img里面的文件,文件已經(jīng)上傳到該頁面《文件名為uuid生成的文件名》

文件上傳源代碼:

<span style="font-size:14px;">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 style="white-space: pre;"> </span>//doGET防止有人在用戶欄輸入地址。沒有響應(yīng) 
<span style="white-space: pre;"> </span>@Override 
<span style="white-space: pre;"> </span>protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
<span style="white-space: pre;"> </span>throws ServletException, IOException { 
<span style="white-space: pre;"> </span>resp.setContentType("utf-8"); 
<span style="white-space: pre;"> </span>Writer wr=resp.getWriter(); 
<span style="white-space: pre;"> </span>wr.write("暫不支持該上傳方式"); 
<span style="white-space: pre;"> </span>} 
<span style="white-space: pre;"> </span> 
<span style="white-space: pre;"> </span>public void doPost(HttpServletRequest request, HttpServletResponse response) 
<span style="white-space: pre;"> </span>throws ServletException, IOException { 
<span style="white-space: pre;"> </span>request.setCharacterEncoding("utf-8"); 
<span style="white-space: pre;"> </span>response.setContentType("text/html;charset=utf-8"); 
<span style="white-space: pre;"> </span>PrintWriter out=response.getWriter(); 
<span style="white-space: pre;"> </span>//防護 以普通表單上傳 法一: 
<span style="white-space: pre;"> </span>//返回值 GET (null) POST1(apllication/x-form-urlencoded,普通表單) POST2(file:multipart/form-data,文件上傳表單) 
//<span style="white-space: pre;"> </span>String type =request.getContentType(); 
//<span style="white-space: pre;"> </span>if(!type.contains("mulitpart/form-data")){ 
//<span style="white-space: pre;"> </span>out.write("不支持普通表單的上傳2"); 
//<span style="white-space: pre;"> </span>return ; 
//<span style="white-space: pre;"> </span>} 
<span style="white-space: pre;"> </span>// 法二 
<span style="white-space: pre;"> </span>boolean boo=ServletFileUpload.isMultipartContent(request); 
<span style="white-space: pre;"> </span>if(boo==false){ 
<span style="white-space: pre;"> </span>out.print("不支持普通表單的上傳1"); 
<span style="white-space: pre;"> </span> 
<span style="white-space: pre;"> </span>} 
<span style="white-space: pre;"> </span> 
<span style="white-space: pre;"> </span>//指定臨時存放位置 
<span style="white-space: pre;"> </span>File f = new File("F:/ex/temp");//指定臨時文件存放位置 
<span style="white-space: pre;"> </span>DiskFileItemFactory ff =new DiskFileItemFactory(1024*1024*5, f);//臨時文件的大小和存放位置 
<span style="white-space: pre;"> </span> 
<span style="white-space: pre;"> </span>//創(chuàng)建用于解析的對象 
<span style="white-space: pre;"> </span>ServletFileUpload sf =new ServletFileUpload(ff); 
<span style="white-space: pre;"> </span>sf.setFileSizeMax(1024*1024*10);//僅僅允許單個存放位置最大值是 10M 
<span style="white-space: pre;"> </span>sf.setSizeMax(1024*1024*20);//所有文件的最大值是20M 
<span style="white-space: pre;"> </span>String path =this.getServletContext().getRealPath("/imgs"); 
<span style="white-space: pre;"> </span>System.out.println("存儲路徑:"+path); 
<span style="white-space: pre;"> </span>//開始進行解析 
<span style="white-space: pre;"> </span>FileItem it0=null;//用于在finally中進行刪除臨時文件 
<span style="white-space: pre;"> </span>try { 
<span style="white-space: pre;"> </span>List<FileItem> list=sf.parseRequest(request);//獲得從前臺傳過來的所有信息,前臺必須填寫enctype="multipart/form-data" 
<span style="white-space: pre;"> </span>for(FileItem it:list){ 
<span style="white-space: pre;"> </span>it0=it; 
<span style="white-space: pre;"> </span>if(it.isFormField()){//是普通表單項,如 type=text里面name的值 
<span style="white-space: pre;">  </span>String name=it.getString("utf-8"); 
<span style="white-space: pre;">  </span>System.out.println("基本表單項 name:"+name);//下面寫的解釋的名字 
<span style="white-space: pre;"> </span>}else{ 
<span style="white-space: pre;">  </span>String name=it.getName();//具體的文件路徑 
//<span style="white-space: pre;">  </span>String n1=it.getFieldName(); 
//<span style="white-space: pre;">  </span>String str=it.getString();//文件里面的內(nèi)容 
//<span style="white-space: pre;">  </span>System.out.println("str"+str); 
//<span style="white-space: pre;">  </span>System.out.println("n1:"+n1); 
<span style="white-space: pre;">  </span>String contenttype=it.getContentType(); 
<span style="white-space: pre;">  </span>Long size=it.getSize(); 
<span style="white-space: pre;">  </span>//防止文件為空 
<span style="white-space: pre;">  </span>if(size==0){ 
<span style="white-space: pre;">  </span>continue;//文件為空,直接返回; 
<span style="white-space: pre;">  </span>} 
<span style="white-space: pre;">  </span>//用戶名。必須要填寫 
<span style="white-space: pre;">  </span>if(name==null||name.trim()==""){ 
<span style="white-space: pre;">  </span>continue; 
<span style="white-space: pre;">  </span>} 
<span style="white-space: pre;"> </span>//<span style="white-space: pre;"> </span>System.out.println(name+","+contenttype+","+size); 
<span style="white-space: pre;">  </span>//在服務(wù)器端的資源文件名不能用中文,瀏覽器會自動編碼-------必須要把用戶上傳的文件名轉(zhuǎn)成沒有中文的名字存儲, 
<span style="white-space: pre;">  </span>//為了讓用戶在下載時能還原出原來的名字,就要把原文件名和映射名的對應(yīng)關(guān)系存儲起來,在用戶下載時再轉(zhuǎn)換回來 
<span style="white-space: pre;">  </span>//映射名 
<span style="white-space: pre;">  </span>String id=UUID.randomUUID().toString().replace("-", ""); 
<span style="white-space: pre;">  </span>//文件名 
<span style="white-space: pre;">  </span>String lastname=name.substring(name.lastIndexOf(".")); 
<span style="white-space: pre;">  </span>//名字文件格式都找到了---組合 
<span style="white-space: pre;">  </span>String filename =id+lastname; 
<span style="white-space: pre;">  </span>//拷貝流。讓它寫到相應(yīng)位置 
<span style="white-space: pre;">  </span>FileUtils.copyInputStreamToFile(it.getInputStream(), new File(path+"/"+filename));}<span style="white-space: pre;"> </span>}} catch (FileUploadException e) { 
<span style="white-space: pre;"> </span>throw new RuntimeException("文件上傳解析錯誤。"+e); 
<span style="white-space: pre;"> </span>}finally{ 
<span style="white-space: pre;"> </span>if(it0==null){ 
<span style="white-space: pre;"> </span>it0.delete();//刪除臨時文件 
<span style="white-space: pre;"> </span>}}out.close();}}</span><span style="font-size: 18px;"> 
</span> 
文件下載源代碼:
[html] view plaincopyprint?
<span style="font-size:14px;">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 { 
 //設(shè)置相應(yīng)頭 
 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");//從客服端傳過來的參數(shù)名 
 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 style="font-size: 18px;"> 
</span> 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • springboot整合 xxl-job及使用步驟

    springboot整合 xxl-job及使用步驟

    XXL-JOB是一個分布式任務(wù)調(diào)度平臺,用于解決分布式系統(tǒng)中的任務(wù)調(diào)度和管理問題,文章詳細介紹了XXL-JOB的架構(gòu),包括調(diào)度中心、執(zhí)行器和Web管理控制臺,并提供了使用步驟,包括下載、配置、啟動和創(chuàng)建執(zhí)行器和任務(wù),感興趣的朋友一起看看吧
    2025-01-01
  • spring boot tomcat版本升級的實現(xiàn)示例

    spring boot tomcat版本升級的實現(xiàn)示例

    本文主要介紹了spring boot tomcat版本升級的實現(xiàn)示例,將tomcat升級一個小版本升級到9.0.44版本,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • SpringBoot框架RESTful接口設(shè)置跨域允許

    SpringBoot框架RESTful接口設(shè)置跨域允許

    這篇文章主要為大家詳細介紹了SpringBoot框架RESTful接口設(shè)置跨域允許,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java拼接字符串時如何去掉最后一個多余的逗號

    Java拼接字符串時如何去掉最后一個多余的逗號

    當(dāng)我們遍歷拼接字符串的時候,最后會多出一個我們添加的字符(比如逗號),下面通過實例代碼給大家介紹Java拼接字符串時去掉最后一個多余的逗號,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java11中基于嵌套關(guān)系的訪問控制優(yōu)化詳解

    Java11中基于嵌套關(guān)系的訪問控制優(yōu)化詳解

    Java(和其他語言)通過內(nèi)部類支持嵌套類,要使其正常工作,需要編譯器執(zhí)行一些技巧,下面這篇文章主要給大家介紹了關(guān)于Java11中基于嵌套關(guān)系的訪問控制優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • SpringBoot使用Flyway進行數(shù)據(jù)庫管理的操作方法

    SpringBoot使用Flyway進行數(shù)據(jù)庫管理的操作方法

    Flyway是一個開源的數(shù)據(jù)庫版本管理工具,并且極力主張“約定大于配置”,簡單、專注、強大。接下來通過本文給大家介紹SpringBoot使用Flyway進行數(shù)據(jù)庫管理的方法,感興趣的朋友一起看看吧
    2021-09-09
  • Spring Data JPA 關(guān)鍵字Exists的用法說明

    Spring Data JPA 關(guān)鍵字Exists的用法說明

    這篇文章主要介紹了Spring Data JPA 關(guān)鍵字Exists的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 2020.2 IntelliJ IDEA激活與IDEA2020.2破解詳細教程

    2020.2 IntelliJ IDEA激活與IDEA2020.2破解詳細教程

    這篇文章主要介紹了2020.2 IntelliJ IDEA激活與IDEA2020.2破解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 通過JDBC連接oracle數(shù)據(jù)庫的十大技巧

    通過JDBC連接oracle數(shù)據(jù)庫的十大技巧

    通過JDBC連接oracle數(shù)據(jù)庫的十大技巧...
    2006-12-12
  • Java使用鎖解決銀行取錢問題實例分析

    Java使用鎖解決銀行取錢問題實例分析

    這篇文章主要介紹了Java使用鎖解決銀行取錢問題,結(jié)合實例形式分析了java線程同步與鎖機制相關(guān)原理及操作注意事項,需要的朋友可以參考下
    2019-08-08

最新評論

宝山区| 宁国市| 黄骅市| 翁牛特旗| 新源县| 云阳县| 宁海县| 太谷县| 肇庆市| 金昌市| 聊城市| 岑溪市| 策勒县| 宁夏| 丹凤县| 霞浦县| 保靖县| 龙川县| 丽江市| 山丹县| 图们市| 漯河市| 屯昌县| 武冈市| 北票市| 漾濞| 柯坪县| 云梦县| 渝中区| 贞丰县| 从化市| 台州市| 微博| 镇康县| 舒城县| 沽源县| 宜州市| 内丘县| 武汉市| 无锡市| 呈贡县|