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

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Servlet3.0實(shí)現(xiàn)文件上傳的方法

Servlet3.0實(shí)現(xiàn)文件上傳的方法

2020-09-02 10:00Lucky_Light Java教程

本篇文章主要介紹了Servlet實(shí)現(xiàn)文件上傳的方法,所謂文件上傳就是將本地的文件發(fā)送到服務(wù)器中保存。有興趣的可以了解一下。

servlet 實(shí)現(xiàn)文件上傳

所謂文件上傳就是將本地的文件發(fā)送到服務(wù)器中保存。例如我們向百度網(wǎng)盤(pán)中上傳本地的資源或者我們將寫(xiě)好的博客上傳到服務(wù)器等等就是典型的文件上傳。

servlet 3.0

上次完成文件下載功能使用的是 servlet 2.5,但是想要完成文件上傳,那么繼續(xù)使用 servlet 2.5 肯定不是一個(gè)好的選擇,因此我們使用 servlet 3.0 來(lái)完成文件上傳。下面我來(lái)簡(jiǎn)單介紹一下 servlet 3.0 的新特性:

1、新增的注解支持

該版本新增了若干注解,用于簡(jiǎn)化 servlet、過(guò)濾器(filter)和監(jiān)聽(tīng)器(listener)的聲明,這使得 web.xml 部署描述文件從該版本開(kāi)始不再是必選的了。

2、httpservletrequest 對(duì)文件上傳的支持

此前,對(duì)于處理上傳文件的操作一直是讓開(kāi)發(fā)者頭疼的問(wèn)題,因?yàn)?servlet 本身沒(méi)有對(duì)此提供直接的支持,需要使用第三方框架來(lái)實(shí)現(xiàn),而且使用起來(lái)也不夠簡(jiǎn)單。如今這都成為了歷史,servlet 3.0 已經(jīng)提供了這個(gè)功能,而且使用也非常簡(jiǎn)單。
servlet 3.0 的新特性當(dāng)然肯定不止這些,但是其他的新特性在這里我們暫時(shí)還用不到,也就不做過(guò)多了解了。

必要條件

想要完成文件上傳,肯定不是這么簡(jiǎn)單,它對(duì)瀏覽器端和服務(wù)器端都有許多的要求。

對(duì)瀏覽器的要求

  1. 一個(gè)文件的大小一般肯定不止 1 kb,既然這樣,那么要上傳一個(gè)文件肯定不能使用 get 方式了,所以上傳文件時(shí)必須采用 post 方式。
  2. 2.表單中必須有一個(gè)文件上傳項(xiàng) <input type="file"> ,而且必須有 name 屬性。
  3. 必須設(shè)置表單的 enctype 屬性值為 multipart/form-data

對(duì)服務(wù)器的要求:

  1. 當(dāng)然,我們肯定得使用 servlet 3.0。
  2. servlet 3.0 中接收普通上傳組件(除了文件上傳組件)通過(guò) request.getparameter(string)接收,而文件上傳組件通過(guò) request.getpart(string)接收。
  3. servlet 3.0 要求服務(wù)器必須是 tomcat7 及其以上。

準(zhǔn)備工作

工欲善其事,必先利其器。

1、首先,打開(kāi) eclipse,新建一個(gè) dynamic web project

Servlet3.0實(shí)現(xiàn)文件上傳的方法

2、鍵入項(xiàng)目名,選擇運(yùn)行時(shí)環(huán)境為 apache tomcat v7.0,選擇 servlet 版本為 3.0,然后點(diǎn)擊 finished

Servlet3.0實(shí)現(xiàn)文件上傳的方法

3、在項(xiàng)目的 webcontent 目錄下,新建一個(gè)文件夾 upload,用來(lái)存放上傳過(guò)來(lái)的文件。

Servlet3.0實(shí)現(xiàn)文件上傳的方法

4、在 webcontent 目錄下新建一個(gè) index.jsp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contenttype="text/html; charset=utf-8"
 pageencoding="utf-8"%>
<!doctype html>
<html>
 <head>
   <meta charset="utf-8">
   <title>上傳</title>
 </head>
 
 <body>
   <form action="${pagecontext.request.contextpath}/uploadservlet" method="post" enctype="multipart/form-data">
     <label>選擇一個(gè)文件:</label>
     <input type="file" name="file"><br>
     <input type="submit" value="上傳"><br>
   </form>
 </body>
</html>

5、使用 tomcat 將次項(xiàng)目發(fā)布,并在瀏覽器中預(yù)覽。

Servlet3.0實(shí)現(xiàn)文件上傳的方法

將服務(wù)器啟動(dòng),然后在瀏覽器中輸入:http://localhost:8080/upload

Servlet3.0實(shí)現(xiàn)文件上傳的方法

好吧!樣子有點(diǎn)丑,希望不要介意!如果出現(xiàn)以上界面,那么,準(zhǔn)備工作就完成了!

完成案例

首先,新建一個(gè) servlet,在 servlet 3.0 我們不必再為配置 web.xml 而煩惱了,只要要在 servlet 的類(lèi)名上面一行添加一個(gè)注解:

?
1
@webservlet("/uploadservlet")

這個(gè)注解就相當(dāng)與 servlet 2.5 中的:

?
1
2
3
4
5
6
7
8
<servlet>
  <servlet-name>uploadservlet</servlet-name>
  <servlet-class>club.luckylight.upload.uploadservlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>uploadservlet</servlet-name>
  <url-pattern>/uploadservlet</url-pattern>
</servlet-mapping>

這樣比較,使用注解不是簡(jiǎn)便了很多。

然后,我們還需要添加另一個(gè)注解:

?
1
@multipartconfig

該注解主要是為了輔助 servlet 3.0 中 httpservletrequest 提供的對(duì)上傳文件的支持。該注解標(biāo)注在 servlet 上面,以表示該 servlet 希望處理的請(qǐng)求的 mime類(lèi)型 是 multipart/form-data

接下來(lái),我們就需要根據(jù)上傳組件的 name 屬性獲取它了。這里我們使用 path request.getpart(string) 方法。

?
1
part part = request.getpart("file");

然后,我們就需要根據(jù) part 獲取頭信息,然后根據(jù)頭信息獲取文件的路徑。

在瀏覽器抓包,獲取頭信息為:

Servlet3.0實(shí)現(xiàn)文件上傳的方法

據(jù)此,我們可以獲取文件名或者文件路徑。

?
1
2
string header = part.getheader("content-disposition");
string path = header.substring(header.indexof("filename=") + 10, header.length() - 1);

由于獲取的有可能是文件名,也有可能是文件路徑,為此,有必要編寫(xiě)一個(gè)工具類(lèi),用來(lái)獲取文件的真實(shí)名稱(chēng)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * 根據(jù)文件的路徑獲取文件真實(shí)名稱(chēng)
 *
 * @param path
 *      文件的路徑
 * @return 文件名稱(chēng)
 */
public static string getrealname(string path) {
  int index = path.lastindexof("\\");
 
  if (index == -1) {
    index = path.lastindexof("/");
  }
 
  return path.substring(index + 1);
}

然后,調(diào)用這個(gè)方法,獲得文件名。

?
1
string name = uploadutils.getrealname(path);

接下來(lái),我們有必要,給每個(gè)文件分配一個(gè)存放目錄,因此我又編寫(xiě)了一個(gè)方法,用來(lái)生成一個(gè)目錄。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 根據(jù)文件名返回一個(gè)目錄
 *
 * @param name
 *      文件名稱(chēng)
 * @return 目錄
 */
public static string getdir(string name) {
  int i = name.hashcode();
  string hex = integer.tohexstring(i);
  int j = hex.length();
 
  for (int k = 0; k < 8 - j; k++) {
    hex = "0" + hex;
  }
 
  return "/" + hex.charat(0) + "/" + hex.charat(1);
}

到此,萬(wàn)事俱備,只欠東風(fēng)。我們只需要將文件拷貝到服務(wù)器。

?
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
// 獲取文件的真實(shí)路徑
string realpath = this.getservletcontext().getrealpath("/upload" + dir);
file file = new file(realpath);
 
if (!file.exists()) {
  file.mkdirs();
}
 
// 獲取輸入流
inputstream inputstream = part.getinputstream();
// 定義輸出流
fileoutputstream outputstream = new fileoutputstream(new file(file, name));
 
// 從輸入流中讀入數(shù)據(jù)并寫(xiě)到輸出字節(jié)流中
int len = -1;
byte[] bytes = new byte[1024];
while ((len = inputstream.read(bytes)) != -1) {
  outputstream.write(bytes, 0, len);
}
 
// 關(guān)閉資源
outputstream.close();
inputstream.close();
 
// 刪除臨時(shí)文件
part.delete();

下面來(lái)測(cè)試一下:

Servlet3.0實(shí)現(xiàn)文件上傳的方法

然后,在 tomcat webapps -> 項(xiàng)目名 -> upload 中就可以找到上傳成功的文件了!

Servlet3.0實(shí)現(xiàn)文件上傳的方法

最后,我們打開(kāi)音樂(lè)來(lái)試驗(yàn)下是否真的上傳成功了?

Servlet3.0實(shí)現(xiàn)文件上傳的方法

嗯!薛之謙低沉的聲音從耳機(jī)中傳來(lái),看來(lái)確實(shí)是上傳成功了!

完整代碼

uploadservlet.java

?
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
package club.luckylight.upload;
 
import java.io.file;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.inputstream;
 
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;
 
import club.luckylight.util.uploadutils;
 
@webservlet("/uploadservlet")
@multipartconfig
public class uploadservlet extends httpservlet {
 
  private static final long serialversionuid = 5661013723204858883l;
 
  protected void doget(httpservletrequest request, httpservletresponse response)
      throws servletexception, ioexception {
    // 獲取文件上傳組件
    part part = request.getpart("file");
 
    // 獲取文件的路徑
    string header = part.getheader("content-disposition");
    string path = header.substring(header.indexof("filename=") + 10, header.length() - 1);
 
    // 獲取文件名
    string name = uploadutils.getrealname(path);
 
    // 獲取文件的存放目錄
    string dir = uploadutils.getdir(name);
 
    string realpath = this.getservletcontext().getrealpath("/upload" + dir);
    file file = new file(realpath);
    if (!file.exists()) {
      file.mkdirs();
    }
 
    // 對(duì)拷流
    inputstream inputstream = part.getinputstream();
    fileoutputstream outputstream = new fileoutputstream(new file(file, name));
    int len = -1;
    byte[] bytes = new byte[1024];
    while ((len = inputstream.read(bytes)) != -1) {
      outputstream.write(bytes, 0, len);
    }
 
    // 關(guān)閉資源
    outputstream.close();
    inputstream.close();
 
    // 刪除臨時(shí)文件
    part.delete();
 
    response.setcontenttype("text/html;charset=utf-8");
    response.getwriter().print("文件" + name + "上傳成功!");
  }
 
  protected void dopost(httpservletrequest request, httpservletresponse response)
      throws servletexception, ioexception {
    doget(request, response);
  }
 
}

uploadutils.java

?
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
package club.luckylight.util;
 
public class uploadutils {
 
  /**
   * 根據(jù)文件的路徑獲取文件真實(shí)名稱(chēng)
   *
   * @param path
   *      文件的路徑
   * @return 文件名稱(chēng)
   */
  public static string getrealname(string path) {
    int index = path.lastindexof("\\");
 
    if (index == -1) {
      index = path.lastindexof("/");
    }
 
    return path.substring(index + 1);
  }
 
  /**
   * 根據(jù)文件名返回一個(gè)目錄
   *
   * @param name
   *      文件名稱(chēng)
   * @return 目錄
   */
  public static string getdir(string name) {
    int i = name.hashcode();
    string hex = integer.tohexstring(i);
    int j = hex.length();
 
    for (int k = 0; k < 8 - j; k++) {
      hex = "0" + hex;
    }
 
    return "/" + hex.charat(0) + "/" + hex.charat(1);
  }
}

總結(jié)

這樣,文件上傳案例就完成了,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.jianshu.com/p/1968019b6927#

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品在看在线观看 | 秘书在办公室疯狂被hd | 羞羞麻豆国产精品1区2区3区 | 亚洲天堂免费观看 | 国产精品亚洲综合第一区 | yellow在线 | 午夜小视频网站 | 国产精品久久久久这里只有精品 | 四缺一小说 | 天堂8在线天堂资源bt | 精品久久久久久亚洲 | 日韩成人在线网站 | 午夜私人影院在线观看 视频 | 黑人巨大和日本娇小中出 | 草草线在成年免费视频网站 | 成人影院观看 | 污网站免费观看在线高清 | 国产精品午夜剧场 | 亚洲天堂男人 | 高清国语自产拍免费视频国产 | 互换娇妻爽文100系列小说 | 日韩大片免费观看 | 久久伊人影视 | 动漫人物差差插曲漫画 | 扒开斗罗美女了的胸罩和内裤漫画 | 亚洲欧美日韩成人一区在线 | 韩国理论片最新第一页 | 日本免费精品视频 | 色婷亚洲 | 欧美肥b | 操美女骚b | 国产a一级毛片午夜剧院 | 456在线观看 | 欧美高清一区 | 日本高清色视频www 日本高清免费观看 | 国产99视频精品免费视频7 | 亚洲狠狠婷婷综合久久久久网站 | 三叶草私人研究所 | 免费波多野结衣庭教师 | 国产亚洲福利一区二区免费看 | 亚洲视频高清 |