課件so easy系列之文件教程_第1頁(yè)
課件so easy系列之文件教程_第2頁(yè)
課件so easy系列之文件教程_第3頁(yè)
課件so easy系列之文件教程_第4頁(yè)
課件so easy系列之文件教程_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、So Easy 系列之文件上傳1. 文件上傳概述1.1.文件上傳所謂文件上傳就是將本地文件上傳到服務(wù)器端,從服務(wù)器端文件到本地的過程。例如目前需要上傳頭像、上傳或網(wǎng)盤等功能都是利用文件上傳功能實(shí)現(xiàn)的。文件上傳實(shí)際上是兩步操作,第一是文件上傳,就是將本地文件上傳到服務(wù)器端,實(shí)現(xiàn)文件多用戶之間的共享,第二是文件,就是將服務(wù)器端的文件到本地磁盤。下面就文件上傳與功能,分別學(xué)習(xí)。1.2. 文件上傳實(shí)現(xiàn)原理首先,需要知道文件是如何實(shí)現(xiàn)上傳及的。文件上傳及實(shí)現(xiàn)原理如下:文件上傳實(shí)現(xiàn)原理分析文件上傳實(shí)現(xiàn)流程如下:客戶端瀏覽器通過文件瀏覽框,選擇需要上傳的文件內(nèi)容(其中包括文件路徑及文件內(nèi)容)??蛻舳藶g覽器通

2、過點(diǎn)擊上傳按鈕,將本地文件上傳到服務(wù)器端。服務(wù)器端通過程序接收本地文件內(nèi)容,并將其保存在服務(wù)器端磁盤中。文件實(shí)現(xiàn)原理分析文件實(shí)現(xiàn)流程如下:客戶端瀏覽器通過點(diǎn)擊按鈕,將服務(wù)器端保存的文件到本地磁盤。服務(wù)器端通過程序?qū)⒎?wù)器端文件響應(yīng)給客戶端。2. 文件上傳實(shí)現(xiàn)2.1. 文件上傳客戶端頁(yè)面實(shí)現(xiàn)在 Web 應(yīng)用程序中實(shí)現(xiàn)文件上能,只需要在客戶端頁(yè)面中添加需要上傳輸入項(xiàng),在服務(wù)器端 Servlet 中上傳文件的數(shù)據(jù),并保存在服務(wù)器端硬盤中即可??蛻舳藶g覽器頁(yè)面實(shí)現(xiàn)文件上能,具體代碼如下:需要注意的是:My JSP upload.jsp starting page文件描述:必須指定 name 屬性值,否

3、則需要上傳的文件數(shù)據(jù)是不會(huì)上傳至服務(wù)器端。完成文件上能的表單的請(qǐng)求類型必須是T 方式。完成文件上能的表單的 enctype 屬性值設(shè)置為“multipart/form-data”,該值的作用是將需要上傳的文件數(shù)據(jù)添加到 Http 請(qǐng)求體中,并使用 MIME 協(xié)議對(duì)上傳的文件進(jìn)行描述。2.2. commons-fileupload 工具完成客戶端的文件上能之后,主要是在服務(wù)器端完成接收上傳文件的數(shù)據(jù)內(nèi)容。為了方便實(shí)現(xiàn)文件上傳邏輯,可以使用第提供的文件上傳包,具體如下:jsp-smartupload.jar:使用 JSP 模型一時(shí)使用的,目前基本不再使用。commons-fileupload.ja

4、r:由 Apache提供的,用來實(shí)現(xiàn) Java 環(huán)境下的文件上能。Servlet 3.0 規(guī)范中提供對(duì)文件上傳的支持。commons-fileupload 組件的官網(wǎng)地址:mons-fileupload/。mons.apa需要注意的是:在使用 commons-fileupload 組件時(shí),需要依賴于 commons-io 包。commons-fileupload組件工作流程如下:如何使用 commons-fileupload 組件實(shí)現(xiàn)文件上能,可以參考其官網(wǎng)的 User Guide 內(nèi)容。創(chuàng)建 DiskFileItemFactory 文件項(xiàng)工廠對(duì)象。通過工廠對(duì)象獲取文件上傳請(qǐng)求類 Servle

5、tFileUpload。使用 ServletFileUpload 對(duì)應(yīng) Request 對(duì)象進(jìn)行遍歷每個(gè) fileItem,判斷是否為上傳項(xiàng)。IOUtils.copy(inputStream,OutputStream)(將上傳的數(shù)據(jù)拷貝到服務(wù)器的硬盤上的簡(jiǎn)單方法)具體實(shí)現(xiàn)代碼如下:public claploadServlet extends HttpServlet publicresponse)dopublicresponse)void doGet(HttpServletRequest request, HttpServletResponsethrows ServletException, I

6、OException t(request, response);void dot(HttpServletRequest request, HttpServletResponsethrows ServletException, IOException / 創(chuàng)建DiskFileItemFactory文件項(xiàng)工廠對(duì)象DiskFileItemFactory factory = new DiskFileItemFactory();/ 通過工廠對(duì)象獲取文件上傳請(qǐng)求類ServletFileUploadServletFileUpload upload = new ServletFileUpload(factor

7、y);try / 使用ServletFileUpload對(duì)應(yīng)Request對(duì)象進(jìn)行List items = uplo/ 遍歷每個(gè)fileItemarseRequest(request);for (FileItem fileItem : items) / 判斷fileItem是否是上傳項(xiàng)if (fileItem.isFormField() / 返回true:表示不是上傳項(xiàng)String fieldName = fileItem.getFieldName(); String str = fileItem.getString(utf-8);System.out.prelseln(fieldName+

8、: +str);/ 返回false:表示是上傳項(xiàng)String name InputStream= fileItem.getName();in = fileItem.getInputStream();String uploath =getServletContext().getRealPath(/upload);OutputStream out = newath, name);b;while (b = in.read() out.write(b);FileOutputStream(newFile(uplo!= -1) olose();in.close(); catch (FileUploadEx

9、ception e)e.prStackTrace();2.3. 動(dòng)態(tài)多文件上傳表單上述案例實(shí)現(xiàn)的是單文件上傳,如果想實(shí)現(xiàn)多文件上能的話,服務(wù)器端的邏輯是一樣的,也就是說,只需要在客戶端頁(yè)面實(shí)現(xiàn)多文件上傳控件即可。動(dòng)態(tài)實(shí)現(xiàn)多文件上傳表單代碼如下:2.4. 上傳文件至 WEB-INF 目錄到目前步驟,已經(jīng)可以成功從客戶端瀏覽器向服務(wù)器端上傳文件。但是上傳的路徑存在一些問題,上述上傳路徑是自定義的文件夾,而上傳至這種自定義的文件夾后,通過瀏覽器可以正常,這是非常的。例如一個(gè)用戶上傳一個(gè) JSP 頁(yè)面,然后通過瀏覽器該 JSP 頁(yè)面,而該 JSP 頁(yè)面中可以包含一My JSP upload.jsp s

10、tarting pagefunction add()/ 在div中添加上傳輸入項(xiàng).geementById(uploaddiv).innerHTML += ;function del(obj)/ 傳入obj 就是你點(diǎn)擊 按鈕對(duì)象var div = obj.parentNode; div.parentNode.removeChild(div);些代碼。這時(shí)如果允許用戶運(yùn)行該 JSP 頁(yè)面的話,可能會(huì)對(duì)服務(wù)器端造成很大影響。所以,通常情況下,會(huì)將上傳目錄創(chuàng)建在 Web 工程的 WEB-INF 目錄下。因?yàn)樵撃夸浵碌膬?nèi)容,是無法通過瀏覽器到的。獲取文件上傳路徑的代碼,應(yīng)該修改為如下內(nèi)容:2.5. 上傳

11、文件名稱的處理對(duì)于上傳文件的名稱,可能是文件的完整路徑,例如:C:uploadaaa.jpg。在服務(wù)器端只需要保存其上傳文件的名稱即可,所以需要對(duì)上傳文件的名稱進(jìn)行進(jìn)一步地處理,具體處理代碼如下:目前絕大多數(shù)的瀏覽器都不存在這個(gè)問題,僅僅只有一些比較老的瀏覽器版本存在,例如 IE6.0版本。為保證兼容瀏覽器產(chǎn)品,這個(gè)問題依舊需要解決。2.6. 上傳文件中文亂碼問題如果現(xiàn)在上傳文件的名稱為中文的話,會(huì)引起中文亂碼問題。commons-fileupload 組件為解決中文亂碼問題提供了兩種解決方案,如下:利用 Request 對(duì)象的 setCharacterEncoding(“UTF-8”)方法,

12、該方法盡量編寫在 Servlet 的 doGet()或 dot()方法的頂端。利用 ServletFileUpload 類提供的 setHeaderEncng(“UTF-8”)方法來解決。一般情況下,不關(guān)心上傳文件的內(nèi)容,因?yàn)樯蟼魑募?huì)保存在服務(wù)器端的磁盤中。但是,如果需要在控制臺(tái)打印上傳文件的內(nèi)容,而剛好該上傳文件的內(nèi)容中包含中文的話,可以使用 FileItem 的getString(“UTF-8”)來處理編碼。2.7. 上傳文件同名問題的處理如果同一個(gè)用戶上傳多個(gè)同名的文件,默認(rèn)情況下會(huì)出現(xiàn)被覆蓋的情況,即前一次上傳的文件會(huì)String name = fileItem.getName();

13、/ 文件名可能是絕對(duì)路徑,進(jìn)行切割index = name.lastIndexOf();/ 獲取之后的內(nèi)容(真正的文件名)if(index = 0)name = name.substring(index + 1);String uploath = getServletContext().getRealPath(/WEB-INF/upload);被后一次上傳的文件覆蓋。而這種情況是不希望看到的,解決這個(gè)問題的方法就是可以為每一個(gè)上傳的文件名稱增加 UUID,因?yàn)?UUID 類的 randomUUID()可以生成一個(gè)唯一標(biāo)識(shí)符。具體做法如下:2.8. 一個(gè)目錄不能存放過多文件如果上傳文件過多時(shí),會(huì)

14、導(dǎo)致上傳目錄中的文件過多,內(nèi)容過大。這時(shí)可以考慮將不同文件在不同的目錄中,而生成不同目錄的規(guī)則參考如下:按照上傳時(shí)間進(jìn)行目錄分離,例如 2014-12-12 為一個(gè)目錄。按照上傳用戶進(jìn)行目錄分離,為每一個(gè)用戶創(chuàng)建一個(gè)上傳目錄。按照固定數(shù)量進(jìn)行目錄分離,設(shè)定當(dāng)一個(gè)上傳目錄包含文件超過指定數(shù)量,創(chuàng)建新的上傳目錄。按照唯一文件名的 hashcode 進(jìn)行目錄分離。這里以 hashcode 進(jìn)行目錄分離方式為例演示,具體思路如下:使用 UUID 類的 randomUUID()方法生成唯一標(biāo)識(shí)符。其值為 2dab369c-1e4f-4e58-8b61-13c7aef855b0。通過 hashCode()

15、方法獲取其唯一標(biāo)識(shí)符的 hashcode 值。其值為:166846237,轉(zhuǎn)換成二進(jìn)制后的值為:1100011101。按照每 4 位值“與”二進(jìn)制 1111(F)后,生成一級(jí)目錄。以此類推,每 4 位值“與”二進(jìn)制 1111 后,生成一個(gè)級(jí)別的目錄。根據(jù)上述步驟,可以編寫一個(gè)按照 hashcode 方式生成目錄的工具類,具體代碼如下:/ 獲得二級(jí)目錄d2 = (hashcode 4) & 0 xf;/ 獲得一級(jí)目錄d1 = hashcode & 0 xf;hashcode = uuidFileName.hashCode();name = UUID.randomUUID().toString()

16、 + _ + name;/ 為上傳文件名稱增加UUID的前綴.name = UUID.randomUUID().toString() + _ + name;上述程序代碼可以改寫如下:2.9. 上個(gè)文件的大小限制上傳文件時(shí),用戶可能上傳非常大的文件,可能導(dǎo)致上傳時(shí)占用過多資源。所以,對(duì)于用戶上傳的單個(gè)文件大小,應(yīng)做出相應(yīng)限制。利用 ServletFileUpload 的 setFileSizeMax(long)方法進(jìn)行設(shè)置,其中參數(shù)表示設(shè)置的大小,為字節(jié)數(shù),例如 servletFileUpload.setFileSizeMax(1024*10)表示上限為10KB。一旦上傳的單個(gè)文件大小超過限制大

17、小時(shí),會(huì)拋出 FileUploadBase.FileSizeLimitExceededException異常,可以捕獲該異常后向頁(yè)面輸出相應(yīng)的錯(cuò)誤信息。具體實(shí)現(xiàn)代碼如下:String randomDir = UploadUtils.generateRandomDir(name);String uploath = getServletContext().getRealPath(/WEB-INF/upload + randomDir);/ 生成隨機(jī)目錄new File(uploath).mkdir();d2 = (hashcode 4) & 0 xf;return / + d2 + / + d1;

18、public claploadUtils / 根據(jù)唯一文件名生成 hashcode目錄分離算法public sic String generateRandomDir(String uuidFileName) / 獲得唯一文件名的hashcodehashcode = uuidFileName.hashCode();/ 獲得一級(jí)目錄d1 = hashcode & 0 xf;/ 獲得二級(jí)目錄2.10. 上傳文件的總大小的限制在實(shí)現(xiàn)多文件上傳時(shí),還需要設(shè)置上傳文件的總大小。利用 ServletFileUpload 的 setSizeMax(long)方法進(jìn)行設(shè)置,其中參數(shù)表示設(shè)置的大小,為字節(jié)數(shù),例如

19、 servletFileUpload. setSizeMax(1024*10)表示上限為 10KB。一旦上傳的文件大小超過限制大小時(shí),會(huì)拋出 FileUploadBase.SizeLimitExceededException 異常, catch (FileUploadException e) if (e instanceof FileUploadBase.FileSizeLimitExceededException)/ 在request中保存錯(cuò)誤信息request.setribute(msg, 上傳失敗!上傳的文件超出了10KB!);/ 轉(zhuǎn)發(fā)到index.jsp頁(yè)面中!在index.jsp頁(yè)面

20、中需要使用$msg來顯示錯(cuò)誤信息request.getRequestDispatcher(/index.jsp).forward(request, response);e.prStackTrace();public claploadServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException dot(request, response);public void dot(Http

21、ServletRequest request, HttpServletResponse response) throws ServletException, IOException DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory);/ 設(shè)置單個(gè)上傳文件的大小 upload.setFileSizeMax(1024 * 10); try List items = uploarseRequest(request);for

22、(FileItem fileItem : items) if (fileItem.isFormField() elseString name = fileItem.getName();in.close();可以捕獲該異常后向頁(yè)面輸出相應(yīng)的錯(cuò)誤信息。具體實(shí)現(xiàn)代碼如下:2.11. 文件緩存大小與臨時(shí)目錄一般情況下,上傳文件默認(rèn)都是先在內(nèi)存中,然后在拷貝到服務(wù)器端的磁盤中。但是這樣會(huì)有一些問題出現(xiàn),例如單個(gè)文件過大時(shí),占用服務(wù)器端資源會(huì)過多,導(dǎo)致服務(wù)器性能變差。這時(shí)可以通過手動(dòng)設(shè)置文件緩存大小和上傳文件的臨時(shí)目錄來解決。如果不設(shè)置上傳的文件緩存大小,默認(rèn)值if (e instanceof FileU

23、ploadBase.SizeLimitExceededException) / 在request中保存錯(cuò)誤信息request.setribute(msg, 上傳失??!上傳的文件超出了10KB!);/ 轉(zhuǎn)發(fā)到index.jsp頁(yè)面中!在index.jsp頁(yè)面中需要使用$msg來顯示錯(cuò)誤信息request.getRequestDispatcher(/index.jsp).forward(request, response);e.prStackTrace();public claploadServlet extends HttpServlet public void doGet(HttpServle

24、tRequest request, HttpServletResponse response) throws ServletException, IOException dot(request, response);public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload

25、 = new ServletFileUpload(factory);/ 設(shè)置單個(gè)上傳文件的大小 upload.setSizeMax(1024 * 10); try List items = uploarseRequest(request);for (FileItem fileItem : items) if (fileItem.isFormField() elseString name = fileItem.getName();in.close(); catch (FileUploadException e) 為 10KB,其表示如果上傳文件小于 10KB 的話,會(huì)先在服務(wù)器端的內(nèi)存中,如果上

26、傳文件大小大于 10KB 的話,會(huì)先在服務(wù)器端默認(rèn)指定的臨時(shí)目錄中, 而上傳文件的默認(rèn)臨時(shí)目錄為System.getProperty(java.io.tmpdir)。手動(dòng)修改上傳文件緩存大小及臨時(shí)目錄的方式如下:手動(dòng)修改上傳文件緩存大?。篋iskFileItemFactory.setSizeThreshold(緩存字節(jié)數(shù));手動(dòng)修改上傳文件臨時(shí)目錄:itory(new File(getServletContext().getRealPath( 臨時(shí)目錄相對(duì)路DiskFileItemFactory.setRe徑);具體實(shí)現(xiàn)代碼如下:ServletFileUpload upload = new S

27、ervletFileUpload(factory);try List items = uploarseRequest(request);for (FileItem fileItem : items) if (fileItem.isFormField() elseString name = fileItem.getName();in.close(); catch (FileUploadException e) e.prStackTrace();public claploadServlet extends HttpServlet public void doGet(HttpServletReque

28、st request, HttpServletResponse response) throws ServletException, IOException dot(request, response);public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException DiskFileItemFactory factory = new DiskFileItemFactory();/ 內(nèi)存緩沖區(qū)factory.setSizeThreshold

29、(3 * 1024 * 1024); / 3M/ 臨時(shí)文件位置File reitory = newFile(getServletContext().getRealPath(/tmp); factory.setReitory(reitory);想要?jiǎng)h除臨時(shí)目錄下的臨時(shí)文件的話,只需要調(diào)用 FileItem 的 delete()方法即可。2.12. 文件上傳進(jìn)度器目前大部分具有文件上能的,在文件上傳過程中,可以實(shí)時(shí)看到上傳進(jìn)度??梢允褂肧ervletFileUpload 提供的 setProgressListener()方法實(shí)現(xiàn),在客戶端配置 Ajax 技術(shù)即可實(shí)現(xiàn)。由于目前沒有掌握 Ajax 異

30、步交互技術(shù),所以只能在服務(wù)器端完成查看進(jìn)度功能。其中除使用 setProgressListener()方法實(shí)現(xiàn)外,還需要計(jì)算如下幾個(gè)結(jié)果:已用時(shí)間:當(dāng)前時(shí)間 開始時(shí)間/ 已用時(shí)間 已經(jīng)上傳大小速度:已經(jīng)上傳大小剩余大?。嚎偞笮?剩余時(shí)間:剩余大小/ 速度根據(jù)上述內(nèi)容,具體查看上傳進(jìn)度功能如下:/ 獲取上傳文件的開始時(shí)間final long start = System.currentTimeMillis();/ 為文件上傳對(duì)象,幫助查看進(jìn)度器upload.setProgressListener(new ProgressListener() /*updaong pBytesRead, long

31、pContentLength,pItems)* 該方法用于獲取文件上傳過程相關(guān)數(shù)據(jù)內(nèi)容.* 參數(shù)pBytesRead:到目前為止已經(jīng)字節(jié)總數(shù)(已上傳大小)* 參數(shù)pContentLength:正在上傳字節(jié)總數(shù) (文件大小)* 參數(shù)pItems:當(dāng)前上傳文件,是表單的第幾個(gè)元素*/3. 文件實(shí)現(xiàn)3.1. 實(shí)現(xiàn)文件實(shí)現(xiàn)文件上能后,需要做的就是文件功能。文件不需要第組件支持,自定義完成即可,具體操作步驟如下:創(chuàng)建一個(gè) JSP 頁(yè)面用于顯示文件列表。public void updaong pBytesRead, long pContentLength,pItems)if(pBytesRead = 0)

32、/ 剛開始上傳,還沒有數(shù)據(jù)return;/ 計(jì)算已經(jīng)使用時(shí)間long hasUseTime = System.currentTimeMillis() - start;/ 計(jì)算上傳速度double speed = (double)pBytesRead) / hasUseTime;/ 計(jì)算剩余大小long restBytes = pContentLength - pBytesRead;/ 計(jì)算剩余時(shí)間long restTime = (long) (restBytes / speed);System.out.prln(已用時(shí)間: + hasUseTime + , 傳輸速度: + speed + ,

33、剩余時(shí)間: + restTime);try Thread.sleep(1); catch (erruptedException e) e.prStackTrace(););創(chuàng)建一個(gè) Servlet 用于文件功能。配置 Web 工程的 web.xml 文件。public class DownloadServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / 獲取文件名Str

34、ing filename = request.getParameter(filename);/ 判斷文件是否存在String path = getServletContext().getRealPath(/tmp); File file = new File(path, filename);if (file.isFile() & file.exists() / 說明文件存在/ 為設(shè)置ContentType和Content-Disitionresponse.setContentType(getServletContext().getMimeType(filename); response.set

35、Header(Content-Disition,attaent;filename=+filename);/文件的內(nèi)容,寫到客戶端InputStream in = new BufferedInputStream(new FileInputStream(file);IOUtils.copy(in, response.getOutputStream(); in.close();public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException do

36、Get(request, response);My JSP download.jsp starting page1.jpg2.rar3.txt3.2. 中文亂碼解決文件功能實(shí)現(xiàn)后,還需要解決中文亂碼問題。由于頁(yè)面中的文件名是使用 GET 方式提交請(qǐng)求的,所以可以使用如下代碼解決:而上述代碼只能解決服務(wù)器端接收客戶端請(qǐng)求時(shí)參數(shù)的中文亂碼問題,但是點(diǎn)擊文件時(shí)的文件名稱依舊是亂碼的。這個(gè)問題是由于瀏覽器本身,不同瀏覽器的解決方式不同:IE 瀏覽器:使用 URL 編碼。其他瀏覽器,使用 BASE64 編碼??梢酝ㄟ^ Http 請(qǐng)求協(xié)議的請(qǐng)求頭中的“User-Agent”內(nèi)容,判斷客戶端當(dāng)前使用的瀏覽器

37、是哪個(gè)產(chǎn)品。BASE64Encoder base64Encoder = new BASE64Encoder(); filename = =?utf-8?B? + base64Encoder.encode(filename.getBytes(utf-8) + ?=;filename = URLEncoder.encode(filename, utf-8); filename = filename.replace(+, );filename = new String(filename.getBytes(ISO-8859-1),UTF-8);DownloadServletapp.java.servl

38、et.DownloadServletDownloadServlet/download4. 文件上傳案例通過網(wǎng)盤案例實(shí)現(xiàn)文件上傳和功能,并且將文件上傳相關(guān)信息保存到數(shù)據(jù)庫(kù)表中。該案例實(shí)現(xiàn)原理分析如下:數(shù)據(jù)庫(kù)建表語(yǔ)句如下:創(chuàng)建一個(gè) JSP 頁(yè)面用于網(wǎng)盤案例的主頁(yè)面(提供文件上能和文件列表功能)。CREATE TABLE resour(idPRIMARY KEY AUTO_INCREMENT, uuidname VARCHAR(100) UNIQUE NOT NULL, realname VARCHAR(40) NOT NULL, savepath VARCHAR(100) NOT NULL,upl

39、oadtime TIMEST, desscription VARCHAR(255);String agent = request.getHeader(User-Agent);if(agent.contains(MSIE)/ IE瀏覽器,使用URL編碼else/ 其他瀏覽器,使用BASE64編碼4.1. 文件上能首先實(shí)現(xiàn)網(wǎng)盤中的文件上能,具體實(shí)現(xiàn)步驟如下:創(chuàng)建一個(gè) JSP 頁(yè)面用于文件上能。My JSP upload.jsp starting page文件上傳文件上傳文件描述My JSP index.jsp starting page文件上傳綜合系統(tǒng)文件上傳文件創(chuàng)建一個(gè) Servlet 用于處理

40、文件上能。public claploadServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /if判斷form是否為上傳表單 (!ServletFileUpload.isMultipartContent(request) throw new RuntimeException(該請(qǐng)求不是有效編碼方式!);/定義與數(shù)據(jù)庫(kù)關(guān)聯(lián)對(duì)象Resource resource = ne

41、w Resource();/ 創(chuàng)建文件項(xiàng)工廠DiskFileItemFactory diskFileItemFactory = newDiskFileItemFactory();/ 創(chuàng)建器ServletFileUpload fileUpload = new ServletFileUpload( diskFileItemFactory);/ 處理上傳文件名亂碼fileUpload.setHeaderEncoding(utf-8);/try 請(qǐng)求requestList fileItems = fileUplo/ 遍歷每個(gè)FileItemfor (FileItem fileItem : fileIt

42、ems) / 判斷fileItem是否為文件上傳if (fileItem.isFormField() / 不是上傳項(xiàng)arseRequest(request);String name = fileItem.getFieldName();/ 處理亂碼String value = fileItem.getString(utf-8);if (name.equals(description) resouretDescription(value); else / 是上傳項(xiàng)/ 判斷用戶有沒有上傳String filename = fileItem.getName();if(filename = null |

43、 filename.trim().length()throw new RuntimeException(必須要上傳文件!);=0)/上傳文件名中是否包含 文件路徑index = filename.lastIndexOf(); (index != -1) filename = filename.substring(index + 1);if/控制文件名唯一String uuidname = UploadUtils.generateUUIDFilename(filename);/ 生成hashcode 分散目錄String randomDir = UploadUtils.generateRando

44、mDir(uuidname);/ 創(chuàng)建隨機(jī)目錄String savepath = /WEB-INF/upload + randomDir; File dirFile = newFile(getServletContext().getRealPath(savepath);dirFile.mkdirs();/ 上傳文件內(nèi)容InputStream in = newBufferedInputStream(fileItem.getInputStream();OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(

45、dirFile, uuidname);b;while (b = in.read() != -1) out.write(b);in.close();olose();/ 刪除臨時(shí)文件,默認(rèn)內(nèi)存區(qū) 10KfileItem.delete();/ 準(zhǔn)備 resour resour resour數(shù)據(jù)庫(kù)信息 etUuidname(uuidname); etRealname(filename); etSavepath(savepath); catch (FileUploadException e) e.prStackTrace();throw new RuntimeException(文件上傳失?。?;/ 將

46、文件相關(guān)內(nèi)容保存數(shù)據(jù)庫(kù)QueryRunner queryRunner = newQueryRunner(JDBCUtils.getDataSource();String sql = inserto resourvalues(null,?,?,?,null,?);配置 Web 工程的 web.xml 文件。創(chuàng)建 UploadUtils 工具類用于封裝文件上傳依賴邏輯。UploadServletapp.java.servlet.UploadServletUploadServlet/uploadindex.jspObject args = resource.getUuidname(), resour

47、ce.getRealname(), resource.getSavepath(), resource.getDescription() ;try queryRunner.update(sql, args); catch (SQLException e) e.prStackTrace();throw new RuntimeException(將文件信息存入數(shù)據(jù)庫(kù)失敗!);/ 提示用戶文件上傳成功 response.setContentType(text/html;charset=utf-8); response.getWriter().prln(文件上傳成功!);public void dot(

48、HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request, response);創(chuàng)建一個(gè) JavaBean 用于封裝保存數(shù)據(jù)庫(kù)相關(guān)信息。/ 二級(jí)目錄d2 = (hashcode 4) & 0 xf;return / + d1 + / + d2;/* 根據(jù)真實(shí)文件名 生成uuidname*/public sic String generateUUIDFilename(String filename) String uuid = UUID.

49、randomUUID().toString();/ 不想保留源文件名 保留源文件擴(kuò)展名String ext = filename.substring(filename.lastIndexOf(.);return uuid + ext;public claploadUtils /* 根據(jù)唯一文件名,生成隨機(jī)目錄*/public sic String generateRandomDir(String uuidname) hashcode = uuidname.hashCode();/ 一級(jí)目錄d1 = hashcode & 0 xf;return uploadtime;public void se

50、tUploadtime(Timestuploadtime) this.uploadtime = uploadtime;public String getDescription() return description;public void setDescription(String description) this.description = description;public class Resource privateid;private String uuidname; private String realname; private String savepath; privat

51、e Timestuploadtime; private String description; publicgetId() return id;public void setId(id) this.id = id;public String getUuidname() return uuidname;public void setUuidname(String uuidname) this.uuidname = uuidname;public String getRealname() return realname;public void setRealname(String realname

52、) this.realname = realname;public String getSavepath() return savepath;public void setSavepath(String savepath) this.savepath = savepath;public TimestgetUploadtime() 4.2. 文件功能然后實(shí)現(xiàn)文件功能,具體實(shí)現(xiàn)步驟如下:創(chuàng)建一個(gè) Servlet 用于顯示文件列表。配置 Web 工程的 web.xml 文件。web-app ver=2.5xmlns=h/xml/ns/javaeepublic class ListServlet ex

53、tends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException QueryRunner queryRunner = newQueryRunner(JDBCUtils.getDataSource();String sql = select * from resourorder by uploadtime desc;try List resour= queryRunner.query(sql,new B

54、eanLisndler(Resource.class); request.setribute(resour, resour);request.getRequestDispatcher(/download.jsp).forward(request, response); catch (SQLException e) e.prStackTrace();throw new RuntimeException(查詢資源失??!);public void dot(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request, response);創(chuàng)建一個(gè) JSP 頁(yè)面用于顯示文件列表。創(chuàng)建一個(gè) Servlet 用于文件功能。My JSP download.jsp starting page文件資源列表無任何資源資源名稱:$resource.realname 上傳時(shí)間:$r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論