一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - JavaEE實現前后臺交互的文件上傳與下載

JavaEE實現前后臺交互的文件上傳與下載

2020-01-20 11:26lijiao JAVA教程

這篇文章主要介紹了JavaEE實現前后臺交互的文件上傳與下載,分享相關技術,實現文件上傳下載功能,需要的朋友可以參考下

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

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

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

  • 設置響應類型- contentType
  • 設置編碼-setCharacterEncoding
  • 獲取輸出流。

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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>調出Servletcontext,當然也可以直接調用---當一一列出圖片的時候需要文件的絕對路徑</span>
?
1
2
3
4
5
6
7
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>";//提供下載的超鏈接,傳參---傳文件名給用戶鏈接內容下面寫out.print(str);out.print(img+"<br/>");}}

3.文件的具體下載
首先必須設置相應的協議。下載協議就需要設置相應的下載頭

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

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

?
1
2
3
4
5
6
7
<span style="font-size:18px;"> <span style="white-space:pre"> </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 style="color:#ff0000;">"<strong>attachment;filename</strong></span>='"+aa+"'");//獲取從那邊傳過來的文件名,以便于存儲的時候為下載用戶名</span>

 進行具體的下載

?
1
2
3
4
5
6
7
<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>

效果圖:

JavaEE實現前后臺交互的文件上傳與下載

點擊之后的效果圖:

JavaEE實現前后臺交互的文件上傳與下載

傳文件名不一樣

JavaEE實現前后臺交互的文件上傳與下載

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

客戶端發送HTTP必須使用multipart/form-data數據類型,表示復合數據類型。

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

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

需要的包:

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

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

JavaEE實現前后臺交互的文件上傳與下載

詳解:
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、前臺代碼:

?
1
2
3
4
5
6
7
8
9
<span style="font-size:18px;"><h2>上傳文件</h2>
 <form action="UpFile" method="post" <span style="color:#ff0000;">enctype="multipart/form-data"</span> >//必須要寫,不然后臺沒辦法去接收數據
 <!-- 必須添加這個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首先創建一個基于硬盤的工廠,用來存放臨時文件

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

2-2 創建一個用ServletFileUpload對象,并且設置文件大小,最大允許傳多大的文件

 

?
1
2
3
4
5
6
//創建用于解析的對象
 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 開始解析對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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();//文件里面的內容
//   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>在服務器端的資源文件名不能用中文,瀏覽器會自動編碼-------必須要把用戶上傳的文件名轉成沒有中文的名字存儲,
   //為了讓用戶在下載時能還原出原來的名字,就要把原文件名和映射名的對應關系存儲起來,在用戶下載時再轉換回來

 //映射名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為存儲的絕對路徑--之前定義的}
這樣能實現簡單的上傳,但是,這種上傳是沒有一點安全行了。完整的代碼中附上了防一般的小問題還是沒問題的

JavaEE實現前后臺交互的文件上傳與下載

選擇文件之后

JavaEE實現前后臺交互的文件上傳與下載

查看web服務器img里面的文件,文件已經上傳到該頁面《文件名為uuid生成的文件名》

JavaEE實現前后臺交互的文件上傳與下載

文件上傳源代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<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防止有人在用戶欄輸入地址。沒有響應
<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>//創建用于解析的對象
<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();//文件里面的內容
//<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>//在服務器端的資源文件名不能用中文,瀏覽器會自動編碼-------必須要把用戶上傳的文件名轉成沒有中文的名字存儲,
<span style="white-space: pre;">  </span>//為了讓用戶在下載時能還原出原來的名字,就要把原文件名和映射名的對應關系存儲起來,在用戶下載時再轉換回來
<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>//拷貝流。讓它寫到相應位置
<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 {
 //設置相應頭
 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 style="font-size: 18px;">
</span>

以上就是本文的全部內容,希望對大家的學習有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天堂中文在线免费观看 | a韩剧| 天天干天天爽天天操 | 国产伦精品一区二区三区免费观看 | 久久黄色精品视频 | 猫咪av| 三级全黄的视频 | 日本动漫打扑克动画片樱花动漫 | 99热人人| 日韩一区国产二区欧美三 | 7777色鬼xxxx欧美色夫 | 亚洲看片lutube在线入口 | 91精品综合国产在线观看 | 免费在线观看日韩 | 日本红怡院亚洲红怡院最新 | 黑人开嫩苞 | 60岁妇女毛片免费观看 | 无人区在线观看免费完整版免费 | 91人人在线 | 国产小视频在线免费 | 亚洲精品一区二区三区在线播放 | 久久草福利自拍视频在线观看 | 精品久久久久久久久久久 | 蜜色影院 | 第四色男人天堂 | 亚洲精品一区二区三区在线播放 | 国产二区精品视频 | 成人男女啪啪免费观看网站 | 成人免费淫片95视频观看网站 | 欧美四区| 国产成人无精品久久久 | bdsm酷刑折磨死美女 | 脱jk裙的美女露小内内无遮挡 | 青青草国产免费国产是公开 | 亚洲成在人网站天堂一区二区 | 久久机热视频 这里只有精品首页 | 胸奶好大好紧好湿好爽 | 四虎现在的网址入口2022 | 91精品大神国产在线播放 | 国产99视频精品免费视频7 | 热久久免费 |