本文通過兩種文件上傳實例進行比較,幫助大家更好的學習java文件上傳功能,具體內容如下
1. 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
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
@Controller public class UploadFile extends BaseJsonController{ /** * 附件上傳 * * @param request * @param creativeFile * @param response * @return */ @RequestMapping (value = "/upload/uploadFile.json" ) public void uploadFile(HttpServletRequest request,HttpServletResponse response) { /** * 1、為保證服務器安全,上傳文件應該放在外界無法直接訪問的目錄下,比如放于WEB-INF目錄下。 * 2、為防止文件覆蓋的現象發生,要為上傳文件產生一個唯一的文件名。 * 3、為防止一個目錄下面出現太多文件,要使用hash算法打散存儲。 * 4、要限制上傳文件的最大值。 * 5、要限制上傳文件的類型,在收到上傳文件名時,判斷后綴名是否合法。 */ //得到上傳文件的保存目錄,將上傳的文件存放于WEB-INF目錄下,不允許外界直接訪問,保證上傳文件的安全 String savePath = request.getSession().getServletContext().getRealPath( "/WEB-INF/upload" ); //上傳時生成的臨時文件保存目錄 String tempPath = request.getSession().getServletContext().getRealPath( "/WEB-INF/temp" ); File tmpFile = new File(tempPath); if (!tmpFile.exists()) { //創建臨時目錄 tmpFile.mkdirs(); } //消息提示 JSONArray arr = new JSONArray(); Map<String,Object> map = null ; InputStream in = null ; FileOutputStream out = null ; try { //使用Apache文件上傳組件處理文件上傳步驟: //1、創建一個DiskFileItemFactory工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); //設置工廠的緩沖區的大小,當上傳的文件大小超過緩沖區的大小時,就會生成一個臨時文件存放到指定的臨時目錄當中。 factory.setSizeThreshold( 1024 * 100 ); //設置緩沖區的大小為100KB,如果不指定,那么緩沖區的大小默認是10KB //設置上傳時生成的臨時文件的保存目錄 factory.setRepository(tmpFile); //2、創建一個文件上傳解析器 ServletFileUpload upload = new ServletFileUpload(factory); //監聽文件上傳進度 upload.setProgressListener( new ProgressListener(){ public void update( long pBytesRead, long pContentLength, int arg2) { System.out.println( "文件大小為:" + pContentLength + ",當前已處理:" + pBytesRead); } }); //解決上傳文件名的中文亂碼 upload.setHeaderEncoding( "UTF-8" ); //3、判斷提交上來的數據是否是上傳表單的數據 if (!ServletFileUpload.isMultipartContent(request)){ //按照傳統方式獲取數據 return ; } //設置上傳單個文件的大小的最大值,目前是設置為1024*1024字節,也就是20MB upload.setFileSizeMax( 1024 * 1024 * 20 ); //設置上傳文件總量的最大值,最大值=同時上傳的多個文件的大小的最大值的和,目前設置為40MB upload.setSizeMax( 1024 * 1024 * 40 ); //4、使用ServletFileUpload解析器解析上傳數據,解析結果返回的是一個List<FileItem>集合,每一個FileItem對應一個Form表單的輸入項 @SuppressWarnings ( "unchecked" ) List<FileItem> list = upload.parseRequest(request); for (FileItem item : list){ //如果fileitem中封裝的是普通輸入項的數據 if (item.isFormField()){ String name = item.getFieldName(); //解決普通輸入項的數據的中文亂碼問題 String value = item.getString( "UTF-8" ); //value = new String(value.getBytes("iso8859-1"),"UTF-8"); System.out.println(name + "=" + value); } else { //如果fileitem中封裝的是上傳文件 //得到上傳的文件名稱, String filename = item.getName(); if (filename== null || filename.trim().equals( "" )){ continue ; } //注意:不同的瀏覽器提交的文件名是不一樣的,有些瀏覽器提交上來的文件名是帶有路徑的,如: c:\a\b\1.txt,而有些只是單純的文件名,如:1.txt //處理獲取到的上傳文件的文件名的路徑部分,只保留文件名部分 filename = filename.substring(filename.lastIndexOf( "\\" )+ 1 ); //得到上傳文件的擴展名 String fileExtName = filename.substring(filename.lastIndexOf( "." )+ 1 ); //如果需要限制上傳的文件類型,那么可以通過文件的擴展名來判斷上傳的文件類型是否合法 if (StringUtils.equals(fileExtName, "rar" ) || StringUtils.equals(fileExtName, "zip" )){ throw new BizException( "" , "禁止上傳壓縮文件!" ); } /*************/ //獲取item中的上傳文件的輸入流 in = item.getInputStream(); /************/ //得到文件保存的名稱 String saveFilename = makeFileName(filename); //得到文件的保存目錄 String realSavePath = makePath(saveFilename, savePath); //創建一個文件輸出流 out = new FileOutputStream(realSavePath + "\\" + saveFilename); //創建一個緩沖區 byte buffer[] = new byte [ 1024 ]; //判斷輸入流中的數據是否已經讀完的標識 int len = 0 ; //循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據 while ((len=in.read(buffer))> 0 ){ //使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath + "\\" + filename)當中 out.write(buffer, 0 , len); } //關閉輸入流 in.close(); //關閉輸出流 out.close(); //刪除處理文件上傳時生成的臨時文件 item.delete(); map = new HashMap<String,Object>(); map.put( "saveFilename" , saveFilename); map.put( "realSavePath" , realSavePath); arr.add(map); } } returnSuccessJSON( "上傳成功" , arr, response); } catch (FileUploadBase.FileSizeLimitExceededException e) { e.printStackTrace(); returnFailJSON(e.getMessage(), "單個文件超出最大值!!!" , response); } catch (FileUploadBase.SizeLimitExceededException e) { e.printStackTrace(); returnFailJSON(e.getMessage(), "上傳文件的總的大小超出限制的最大值!!!" , response); arr.toString(); } catch (Exception e) { e.printStackTrace(); returnFailJSON(e.getMessage(), "文件上傳失敗!" , response); arr.toString(); } finally { try { //關閉輸入流 in.close(); //關閉輸出流 out.close(); } catch (IOException e) { } } } /** * @Method: makeFileName * @Description: 生成上傳文件的文件名,文件名以:uuid+"_"+文件的原始名稱 * @Anthor:xuwentao * @param filename 文件的原始名稱 * @return uuid+"_"+文件的原始名稱 */ private String makeFileName(String filename){ //2.jpg //為防止文件覆蓋的現象發生,要為上傳文件產生一個唯一的文件名 return UUID.randomUUID().toString() + "_" + filename; } /** * 為防止一個目錄下面出現太多文件,要使用hash算法打散存儲 * @Method: makePath * @Description: * @Anthor:xuwentao * * @param filename 文件名,要根據文件名生成存儲目錄 * @param savePath 文件存儲路徑 * @return 新的存儲目錄 */ private String makePath(String filename,String savePath){ //得到文件名的hashCode的值,得到的就是filename這個字符串對象在內存中的地址 int hashcode = filename.hashCode(); int dir1 = hashcode& 0xf ; //0--15 int dir2 = (hashcode& 0xf0 )>> 4 ; //0-15 //構造新的保存目錄 String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5 //File既可以代表文件也可以代表目錄 File file = new File(dir); //如果目錄不存在 if (!file.exists()){ //創建目錄 file.mkdirs(); } return dir; } } |
2. 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
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
|
/** * 上傳簡歷 * 1--創建文件失敗 2--異常 3--上傳失敗 4--文件未獲取 5--文件未刪除 6--請上傳word、excel、ppt、pdf文件 */ /*路徑分隔符:用于自適應操作系統*/ private static final String FILE_SEPARATOR = System.getProperties() .getProperty("file.separator"); /** * 上傳文件 * * @param FileIO * @param oldContractURL * @param request * @return 返回文件地址(相對地址,非絕對地址) */ @Override public String upload(MultipartFile FileIO, String oldContractURL, HttpServletRequest request) { String uploadUrl = request.getSession().getServletContext().getRealPath("files"); //刪除文件及文件夾 if (oldContractURL != null) { String oldDirectory = oldContractURL.substring(5, oldContractURL.lastIndexOf(FILE_SEPARATOR)); File file = new File(uploadUrl + oldDirectory); boolean flag = deleteDir(file); if (!flag) { logger.error("舊文件刪除失敗"); return "5"; } } //上傳新的簡歷文件 long now = System.currentTimeMillis(); uploadUrl = uploadUrl + FILE_SEPARATOR + now + FILE_SEPARATOR; String resumeName = ""; if (!FileIO.isEmpty()) { resumeName = StringUtils.deleteWhitespace(FileIO.getOriginalFilename()); //判斷文件后綴 /*String suffix = resumeName.substring(resumeName.lastIndexOf("."), resumeName.length()) .toLowerCase(); if (!".doc".equals(suffix) && !".docx".equals(suffix) && !".xls".equals(suffix) && !".xlsx".equals(suffix) && !".ppt".equals(suffix) && !".pptx".equals(suffix) && !".pdf".equals(suffix)) { logger.error("不是word、excel、ppt、pdf文件"); return "6"; }*/ } else { logger.error("文件未獲取"); return "4"; } File dir = new File(uploadUrl); if (!dir.exists()) { dir.mkdirs(); } File targetFile = new File(uploadUrl + resumeName); if (!targetFile.exists()) { try { targetFile.createNewFile(); } catch (IOException e) { logger.error("文件創建失敗", e); return "1"; } } try { FileIO.transferTo(targetFile); } catch (IllegalStateException e) { logger.error("語句異常", e); return "2"; } catch (IOException e) { logger.error("上傳失敗", e); return "3"; } return FILE_SEPARATOR + "files" + FILE_SEPARATOR + now + FILE_SEPARATOR + resumeName; } /** * 遞歸刪除目錄下的所有文件及子目錄下所有文件 * @param dir 將要刪除的文件目錄 * @return boolean Returns "true" if all deletions were successful. * If a deletion fails, the method stops attempting to * delete and returns "false". */ public boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); //遞歸刪除目錄中的子目錄下 for ( int i = 0 ; i < children.length; i++) { boolean success = deleteDir( new File(dir, children[i])); if (!success) { return false ; } } } // 目錄此時為空,可以刪除 return dir.delete(); } |
以上就是本文的全部內容,希望對大家的學習有所幫助,掌握java文件上傳的技巧。