Java進(jìn)階之FileUpload完成上傳的實(shí)例
FileUpload是Apache commons下面的一個(gè)子項(xiàng)目,用來(lái)實(shí)現(xiàn)Java項(xiàng)目下的文件上傳功能,常見(jiàn)的文件上傳還有SmartUpload,Servlet3.0,Struts2。
在這里我用的是commons- fileupload-1.2.1,下面就是一個(gè)簡(jiǎn)單實(shí)例,解析過(guò)程都寫(xiě)到代碼中的注釋上了,注釋很詳細(xì)
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
|
//創(chuàng)建磁盤(pán)文件項(xiàng)工廠 DiskFileItemFactory diskFileItemFactory= new DiskFileItemFactory(); //設(shè)置緩沖區(qū)的大小,如果文件的大小超過(guò)了緩沖區(qū)的大小,就會(huì)產(chǎn)生臨時(shí)文件 diskFileItemFactory.setSizeThreshold( 1024 * 1024 * 3 ); //獲得核心解析類(lèi) ServletFileUpload fileUpload= new ServletFileUpload(diskFileItemFactory); //解決中文文件名上傳亂碼 fileUpload.setHeaderEncoding( "UTF-8" ); //解析request,返回list集合 List<FileItem> list = fileUpload.parseRequest(request); //獲得每個(gè)部分,將遍歷的值存入到一個(gè)map集合中 Map<String, String> map= new HashMap<>(); //設(shè)置上傳文件的文件名 String fileName= null ; for (FileItem fileItem : list) { //判斷普通項(xiàng)和文件上傳項(xiàng) if (fileItem.isFormField()) { //普通項(xiàng) String name=fileItem.getFieldName(); String value=fileItem.getString( "UTF-8" ); map.put(name, value); } else { //文件上傳項(xiàng) //獲得文件名 fileName=fileItem.getName(); //獲得文件的輸入流 InputStream is=fileItem.getInputStream(); //獲得文件上傳的路徑 String path= this .getServletContext().getRealPath( "/products/1" ); OutputStream os= new FileOutputStream(path+ "/" +fileName); int len= 0 ; byte [] b= new byte [ 1024 ]; while ((len=is.read(b))!=- 1 ) { os.write(b, 0 , len); } is.close(); os.close(); } |
組件FileUpload使用FileItemFactory工廠創(chuàng)建新的文件項(xiàng)目。這個(gè)給了組件FileUpload很大的靈活性。這個(gè)工廠擁有怎樣創(chuàng)建項(xiàng)目的最終控制權(quán)。工廠執(zhí)行過(guò)程中上傳項(xiàng)目文件的臨時(shí)數(shù)據(jù)可以存儲(chǔ)在內(nèi)存中或硬盤(pán)上。這個(gè)依賴(lài)于上傳項(xiàng)目的大小(即:數(shù)據(jù)的字節(jié))。不過(guò)這種行為可以在你的應(yīng)用程序中適當(dāng)?shù)淖远ㄖ啤?/p>
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
原文鏈接:http://blog.csdn.net/kdc18333608478/article/details/52664720