java - input file類型上傳了一個文件,想計算一下上傳文件的大小?
問題描述
上傳成功之后,用 request.getParameter('filetxt');拿到的是一個路徑:C:fakepathtest.txt這個路徑并非是我本地的路徑,已上傳就已經是這個路徑了。現在我用了一個方法,來計算這個文件的大小,但是沒有成功,不知道為什么?計算大小的方法如下:
public void getFileSize(String path){//傳入文件路徑File file = new File(path);//測試此文件是否存在if(file.exists()){ //如果是文件夾 //這里只檢測了文件夾中第一層 如果有需要 可以繼續遞歸檢測 if(file.isDirectory()){int size = 0;for(File zf : file.listFiles()){ if(zf.isDirectory()) continue; size += zf.length();}System.out.println('文件夾 '+file.getName()+' Size: '+(size/1024f)+'kb'); }else{System.out.println(file.getName()+' Size: '+(file.length()/1024f)+'kb'); }//如果文件不存在}else{ System.out.println('此文件不存在');} }
調用方法: String filetxt = request.getParameter('filetxt');fileSize.getFileSize(filetxt);
(filetxt = 'C:fakepathtest.txt')
結果是:此文件不存在
問題解答
回答1:文件上傳傳輸的格式與一般的表單提交不同,它使用了multipart/form-data格式編碼數據,request.getParameter只能得到鍵值對,文件需要做特殊處理,主要分為兩部分。
前臺處理,確認你前臺form表單的 enctype屬性為multipart/form-data,示例:
<form enctype='multipart/form-data' method='post' action='xxx'> <input type='file' name='file' multiple /><br/> </form>
后臺處理。tomcat7以上可直接使用原生API HttpServletRequest.getPart(),在servlet中:
Part filePart = request.getPart('file'); // 對應 <input type='file' name='file'> long bytes = filePart.getSize(); //獲取文件大小 String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();//文件名 InputStream fileContent = filePart.getInputStream(); //獲取文件輸入流
具體使用可參考javaee文檔servlet3.0(Tomcat7)以下版本,需要第三方jar包來幫助解析上傳的文件。一般使用Apache的commons-fileupload、commons-fileupload-io ,具體使用可參考官方文檔,不再贅述
回答2:file.exists()返回false,從你的文件路徑能看出 不見了,需要檢查一下是在哪個過程被過濾掉。
回答3:上傳文件給你的路徑是 C:fakepathtest.txt 從這個名字就可以看出來這是一個假的路徑。
這個路徑是瀏覽器在上傳給你的時候給你的,這個路徑不是你服務器上真實存在的路徑。所以你拿這個路徑到服務器上找這個文件是不可能找到的。
