1. 程式人生 > 其它 >Java檔案上傳與下載【面試+工作】

Java檔案上傳與下載【面試+工作】

1.servlet 如何實現檔案的上傳和下載?

1.1上傳檔案

  • 通過前臺選擇檔案,然後將資源上傳到(即新建一個檔案)到釋出的資原始檔下面,
  • 下載就是url 到釋出的資原始檔,觸發即可自動下載。伺服器已經封裝瞭如何下載的底層實現。(此處用的是tomcat)
  • JSP上傳檔案方法: 關於在HTTP request 中通過Post方法提交檔案的規範,該專案效能穩定快速,易於部署和使用.本次教程以前端jsp + 後端 servlet的方式,利用JSP上傳檔案,你也可以完全在jsp中實現而不用servlet.

在開始JSP上傳檔案之前你要準備以下幾個東西:

1. commons-FileUpload 1.3 包

下載地址:http://jakarta.apache.org/commons/fileupload/

2. commons-IO 2.5 包

下載地址:http://jakarta.apache.org/commons/io/

有了上面這些東西我們就可以開始了

1. 新建一個叫Servlet_UploadDownLoad的WEB專案

2. 接著把這兩個jar包放到WEB-INF/lib目錄中:

3.接下來我們要準備一份如下內容的upload.jsp檔案,用來選擇要上傳的檔案,

上面檔案中有幾個需要注意的地方就是

1. action="UploadServlet" 必須和後面的web.xml配置檔案中對servlet對映必須保持一致.

2. method="POST" 這裡必須為"POST"方式提交不能是"GET".

3. enctype="multipart/form-data" 這裡是要提交的內容格式,表示你要提交的是資料流,而不是普通的表單文字.

4. file1,file2,file3表示你要3個檔案一起上傳,你也可以一次只上傳一個檔案.

接下來我們要寫一個與上面這個upload.jsp配套的servlet程式,就叫做UploadServlet.java

upload.jsp檔案有了,配套的servlet也有了,現在最後剩下的就是怎麼讓它們配合工作了,接著我們把WEB-INF/web.xml檔案請出來,並在該檔案中加入以下內容:

寫好以後再點選"儲存"

把你的upload專案整個拷貝到tomcat的webapps目錄下,啟動tomcat.開啟IE瀏覽器在位址列中輸入http://localhost:8080/Servlet_UploadDownLoad/upload.jsp怎麼樣看到JSP上傳檔案的輸入框了嗎? 什麼,沒有看到,出錯了! 你仔細檢查一下步驟有沒有對.

好了,現在我們點選頁面上的"瀏覽"按鈕,找到我們要上傳的檔案,最後點選"Submit",太激動了,還不看一下你的I:\updir裡面有沒有你要的東西.

1.2下載檔案

1)通過超連結實現下載

在HTML網頁中,通過超連結連結到要下載的檔案的地址:downloadOne.jsp

"/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip"是檔案路徑,程式結構如下圖:

程式執行後,可以通過單擊需要下載文件實現下載

但是這裡會出現一個問題,就是單擊下載壓縮包的時候會彈出下載頁面,但是下載圖片的時候瀏覽器就直接打開了圖片,沒有下載。

這是因為通過超連結下載檔案時,如果瀏覽器可以識別該檔案格式,瀏覽器就會直接開啟。只有瀏覽器不能識別該檔案格式的時候,才會實現下載。

因此利用第二種方法實現下載功能。

2)通過Servlet程式實現下載

通過Servlet下載檔案的原理是通過servlet讀取目標程式,將資源返回客戶端。

downloadTwo.jsp

其中,/Servlet_UploadDownLoad 是servlet程式的對映路徑

然後新建一個servlet,名稱為ServletDownload,URL對映為/ServletDownload

web.xml :

ServletDownload.java :

重啟tomcat伺服器,即可實現對壓縮包和對圖片的下載。


2、struts如何實現檔案的上傳和下載?

2.1struts上傳檔案

先新建web project ,然後Add Struts Capabilties

struts.xml 的配置:

upload.jsp :

<form action="upload.action" theme="simple" enctype="multipart/form-data" method="post">

表單中enctype="multipart/form-data"的意思,是設定表單的MIME 編碼。預設情況,這個編碼格式是application/x-www-form-urlencoded,不能用於檔案上傳;

只有使用了multipart /form-data,才能完整的傳遞檔案資料,進行下面的操作. enctype="multipart/form-data"是上傳二進位制資料; form裡面的input的值以2進位制的方式傳過去。

theme="simple"是struts2 的一個最簡單的主題,這樣你的標籤就生成最簡單的HTML元素 不會生成額外的內容

<input type="file" name="file" />

【這裡的name一定要與action類裡面的name名字一致,set/get】

success.jsp

web.xml

UploadAction.java

Upload.java

mkdirs()可以建立多級資料夾, mkdir()只會建立一級的資料夾, 如下:

new File("/tmp/one/two/three").mkdirs();

執行後, 會建立tmp/one/two/three四級目錄

new File("/tmp/one/two/three").mkdir();

則不會建立任何目錄, 因為找不到/tmp/one/two目錄, 結果返回false

例子的程式碼結構:2.2struts下載檔案

方法一:通過配置struts.xml檔案

DownloadAction.java

struts.xml

1.結果型別必須要寫成 type="stream" ,與之對應的處理類是 org.apache.struts2.dispatcher.StreamResult

2.涉及到的引數:

1) <param name="contentDisposition">attachment;fileName="${fileName}"</param>

contentDisposition預設是 inline(內聯的), 比如說下載的檔案是文字型別的,就直接在網頁上開啟,不能直接開啟的才會開啟下載框自己選擇

2) attachment :下載時會開啟下載框

3) fileName="${fileName}" :在這定義的名字是一個動態的,該名字是顯示在下載框上的檔名字

3.<param name="inputName">DownloadFile</param>,這個DownloadFile名字要和DownloadAction.java類中的getDownloadFile()方法名去掉get 一致

Struts2下載檔案實現的說明

contentType

內容型別,和網際網路MIME標準中的規定型別一致,例如text/plain代表純文字,text/xml表示XML,image/gif代表GIF圖片,image/jpeg代表JPG圖片

inputName

下載檔案的來源流,對應著action類中某個型別為Inputstream的屬性名,例如取值為inputStream的屬性需要編寫getInputStream()方法

contentDisposition

檔案下載的處理方式,包括內聯(inline)和附件(attachment)兩種方式,而附件方式會彈出檔案儲存對話方塊,否則瀏覽器會嘗試直接顯示檔案。取值為:

attachment;filename="struts2.txt",表示檔案下載的時候儲存的名字應為struts2.txt。如果直接寫filename="struts2.txt",那麼預設情況是代表inline,瀏覽器會嘗試自動開啟它,等價於這樣的寫法:inline;filename="struts2.txt"

bufferSize

下載緩衝區的大小

downloadOne.jsp

例子的程式碼結構:

方法二:通過配置java檔案來實現下載

DownloadByJavaAction.java

downloadByJava.jsp

struts.xml

3、批量下載

使用多執行緒併發呼叫單個檔案的下載方法即可。

4、斷點續傳

有待研究。。。。。。。。。。

附件原始碼:

連結: https://pan.baidu.com/s/1i6wo58L 密碼: 3t3m


springMVC檔案上傳

檔案上傳是專案開發中最常見的功能。為了能上傳檔案,必須將表單的method設定為POST,並將enctype設定為multipart/form-data。只有在這樣的情況下,瀏覽器才會把使用者選擇的檔案以二進位制資料傳送給伺服器。 一旦設定了enctype為multipart/form-data,瀏覽器即會採用二進位制流的方式來處理表單資料,而對於檔案上傳的處理則涉及在伺服器端解析原始的HTTP響應。在2003年,Apache Software Foundation釋出了開源的Commons FileUpload元件,其很快成為Servlet/JSP程式設計師上傳檔案的最佳選擇。 Servlet3.0規範已經提供方法來處理檔案上傳,但這種上傳需要在Servlet中完成。而Spring MVC則提供了更簡單的封裝。 Spring MVC為檔案上傳提供了直接的支援,這種支援是用即插即用的MultipartResolver實現的。Spring MVC使用Apache Commons FileUpload技術實現了一個MultipartResolver實現類:CommonsMultipartResolver。因此,SpringMVC的檔案上傳還需要依賴Apache Commons FileUpload的元件。 本專案作為測試案例,在此我就不建立Maven專案了,我直接建立的是一個Dynamic Web Project(動態的web專案),採用Tomcat 8作為web伺服器,我們需要在專案中引入以下jar包,如下圖:

下面我們在WebContent/WEB-INF下建立一個content資料夾,用於放檔案的上傳、下載等jsp檔案,下面我們建立uploadForm.jsp檔案,演示Spring MVC的檔案上傳:

負責上傳檔案的表單和一般表單有一些區別,負責上傳檔案的表單的編碼型別必須是“multipart/form-data”。 我們再src下建立一個包“cn.edu.jseti.controller”,然後建立一個FileUploadController類,用於實現檔案的上傳和下載功能。以下是負責上傳檔案的表單功能程式碼:

Spring MVC會將上傳的檔案繫結到MultipartFile物件中。MultipartFile提供了獲取上傳檔案內容、檔名等方法。通過transferTo()方法還可以將檔案儲存到硬體中,MultipartFile物件中的常用方法如下:

  • byte[] getBytes():獲取檔案資料
  • String getContentType[]:獲取檔案MIME型別,如image/jpeg等
  • InputStream getInputStream():獲取檔案流
  • String getName():獲取表單中檔案元件的名字
  • String getOriginalFilename():獲取上傳檔案的原名
  • Long getSize():獲取檔案的位元組大小,單位為byte
  • boolean isEmpty():是否有上傳檔案
  • void transferTo(File dest):將上傳檔案儲存到一個目錄檔案中

SpringMVC上下文中預設沒有裝配MultipartResolver,因此預設情況下其不能處理檔案上傳工作。如果想使用Spring的檔案上傳功能,則需要在上下文中配置MultipartResolver。在springmvc-config.xml進行配置檔案如下:

部署FileUpload這個Web應用,在瀏覽器中輸入如下URL來測試應用: http://localhost:8088/FileUpload/uploadForm 輸入檔案描述資訊並選擇上傳檔案,如下圖:

點上傳按鈕,這是已將上傳的檔案通過二進位制儲存到web伺服器上去了,如下圖:

使用物件接收上傳檔案

上面我們通過案例演示了Spring MVC上傳檔案,接下來,我們演示使用物件接收上傳檔案。 在實際專案的開發中,很多時候上傳的檔案會作為物件的屬性被儲存。SpringMVC的處理也非常的簡單。 下面我們在content資料夾建立registerForm.jsp檔案,演示接收檔案上傳:

我們在src下面建立一個名叫“cn.edu.jseti.domain”包,然後再建立一個User類,必須要實現序列化介面,如下案例程式碼:

我們在剛才建立的FileUploadController類繼續寫用於接收檔案的上傳和下載功能。以下是負責接收檔案的表單功能程式碼:

在content資料夾下建立userInfo.jsp檔案,該頁面主要是檔案的下載頁面,如下jsp程式碼:

在瀏覽器中輸入如下URL來測試應用: http://localhost:8088/FileUpload/registerForm 輸入使用者名稱並上傳剛才上傳的檔案。如下圖:

單擊“註冊”按鈕上傳檔案,然後就會跳轉到下載頁面。如下圖:

檔案下載

上面我們通過案例演示了使用物件接收上傳檔案,接下來,我們演示Spring MVC的下載檔案。 檔案下載比較簡單,直接在頁面給出了一個超連結,該連結href的屬性等於要下載檔案的檔名,就可以實現檔案下載了。但是如果該檔案的檔名為中文檔名,在某些早起的瀏覽器上就會導致下載失敗;如果使用最新的Firefox、Chrome、Opera、Safari則都可以正常下載檔名為中文的檔案了。 SpringMVC提供了一個ResponseEntity型別,使用它可以很方便地定義返回的HttpHeaders和HttpStatus。以下程式碼演示檔案的下載功能:

download處理方法接收頁面傳遞的檔名filename後,使用Apache Commons FileUpload元件的FileUtils讀取專案的上傳檔案,並將其構建成ResponseEntity物件返回客戶端下載。 使用ResponseEntity物件,可以很方便的定義返回的HttpHeaders和HttpStatus。上面程式碼中的MediaType,代表的是Internet Media Type,即網際網路媒體型別,也叫做MIME型別。在Http協議訊息頭中,使用Content-Type來表示具體請求中的媒體型別資訊。HttpStatus型別代表的是Http協議中的狀態。有關MediaType和HttpStatus類可以參考Spring MVC的API文件。 點選下載頁面的超連結,顯示檔案正在下載,如下圖所示:

單擊“瀏覽”按鈕,可以選擇下載檔案的儲存路徑,然後單擊“確定”按鈕,檔案就會順利的下載並儲存。

本文中的一些功能案例程式碼和配置檔案不是很完整,下面附上完整程式碼: FileUploadController類完整的程式碼如下:

檔案上傳成功的jsp程式碼:

檔案上傳失敗的jsp程式碼:

web.xml的配置檔案:

OK,以上就是完整的使用Spring MVC框架實現了檔案的上傳和下載。