用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