FileUpload



用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

相關文章
相關標籤/搜索