用request.getParameter("file")方法只能獲得字符串,無論是否文件類型html
form-data表單不能用普通方法獲取,它是二進制封裝,須要字節流操做,太過複雜,因此使用下面的封裝jar包java
須要的jar包apache
- commons-io
- Commons-fileupload
//檢查咱們是否表單類型 boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//1爲基於磁盤的文件項建立工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); //爲基於磁盤的文件項建立工廠 DiskFileItemFactory factory = new DiskFileItemFactory(yourMaxMemorySize,yourTempDirectory); //設置工廠約束 //配置臨時目錄 ServletContext servletContext = this.getServletContext(); File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); factory.setRepository(repository);
//2建立一個新的文件上傳處理程序 ServletFileUpload upload = new ServletFileUpload(factory); //設置upload的編碼 upload.setHeaderEncoding("UTF-8");
//3解析請求 List <FileItem>items = upload.parseRequest(request); //處理上傳的項目,迭代器 //Iterator <FileItem> iter = items.iterator(); for(FileItem item : items){ //普通表單 if(item.isFormField()){ String name = item.getFieldName(); String value = item.getString("UTF-8"); } else { //獲得上傳文件名 String filename = item.getName(); filename = filename.substring(filename.lastIndexOf("\\")+1); //文件名:E:\Data\Howl\bing\test.png //字節輸入流 InputStream in = item.getInputStream(); //字節輸出流 String savepath = this.getServletContext().getRealPath("/upload"); File file = new File(savepath + "\\" + filename); //擴展:這裏能夠用打散的文件 FileOutputStream out = new FileOutputStream(file); int length = 0; byte[] bytes = new byte[1024]; while( (length = in.read(bytes)) != 1 ){ out.write(bytes,0,length); } //刪除臨時文件,當大於設置大小時 item.delete(); in.close(); out.close(); } } //String substring(int beginIndex) //返回一個字符串,該字符串是此字符串的子字符串。 //int lastIndexOf(String str) //返回指定子字符串最後一次出現的字符串中的索引。
form-data數據進行了二進制封裝,因此使用request編碼也無用
打散文件夾
- 低四位生成一級目錄
- 5-8位生成二級目錄
private String makeDirPath(String fileName, String savepath) { //經過文件名來算出一級目錄和二級目錄 int hashCode = fileName.hashCode(); int dir1 = hashCode & 0xf; int dir2 = (hashCode & 0xf0) >> 4; String dir = savepath + "\\" + dir1 + "\\" + dir2; //若是該目錄不存在,就建立目錄 File file = new File(dir); if (!file.exists()) { file.mkdirs(); } //返回全路徑 return dir; }
獲取所有文件
private void getAllFiles(File filePath, Map map) { if(!filePath.isFile()){ File[] files = filePath.listFiles(); for(File file = files){ getAllFiles(file,map); } }else{ String filePath = filePath.getName(); String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1); map.add(filePath,fileName); } }
參考Apachethis
參考Java3y編碼
本文分享 CNBlog - Howlet。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。spa