这个和servlet容器有关系,比如tomcat等。
1.get方式 get方式提交的话,表单项都保存在http header中,格式是 http://localhost:8080/hello.do?name1=value1&name2=value2这样的字符串。server端通过request.getParameter是可以取到值的。 2.post方式(enctype为缺省的application/x-www-form-urlencoded) 表单数据都保存在http的正文部分,格式类似于下面这样:用request.getParameter是可以取到数据的 name1=value1&name2=value23.post方式(enctype为multipart/form-data,多用于文件上传)
表单数据都保存在http的正文部分,各个表单项之间用boundary隔开。格式类似于下面这样:用request.getParameter是取不到数据的,这时需要通过request.getInputStream来取数据,不过取到的是个InputStream,所以无法直接获取指定的表单项(需要自己对取到的流进行解析,才能得到表单项以及上传的文件内容等信息)。这种需求属于比较共通的功能,所以有很多开源的组件可以直接利用。比如:apache的fileupload组件,smartupload等。通过这些开源的upload组件提供的API,就可以直接从request中取得指定的表单项了。//1、创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。 factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB //2、创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); Listlist = upload.parseRequest(request); Map resultMap = new HashMap (); for(FileItem item : list){ String name = item.getFieldName(); //如果fileitem中封装的是普通输入项的数据 String value = item.getString("UTF-8");//解决普通输入项的数据的中文乱码问题 System.out.println(name + "=" + value); resultMap.put(name,value); }
// 使用Apache文件上传组件处理文件上传步骤
// 1.创建一个DiskFileItemFactory工厂DiskFileItemFactory factory = new DiskFileItemFactory();// 设置工厂的缓存区大小,当上传文件的大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录下factory.setSizeThreshold(1024 * 100);// 设置缓存区的大小是100KB,默认10KB// 设置上传时生成的临时文件的保存目录factory.setRepository(tempfile);// 2.创建一个文件上传解析器ServletFileUpload upload = new ServletFileUpload(factory);// 解决上传文件中文乱码问题upload.setHeaderEncoding("utf-8");// 监听文件上传进度upload.setProgressListener(new ProgressListener() { public void update(long pBytesRead, long pContentLength, int arg2) { System.out.println("文件的大小是:" + pContentLength + ",当前已处理:" + pBytesRead);}});// 3.判断上传来的数据是否是上传表单的数据if (!ServletFileUpload.isMultipartContent(request)) { // 按照传统方式获取数据return null;}// 设置上传单个文件的大小的最大值1Mupload.setFileSizeMax(1024 * 1024);// 设置上传文件的总量的最大值10Mupload.setSizeMax(1024 * 1024 * 10);// 4.使用ServletFileUpload解析器解析上传数据,解析的结果返回的是一个List<FileItem>结合,每个FileItem对应一个Form表单的输入项List<FileItem> list = upload.parseRequest(request);for (FileItem item : list) { // 如果fileItem中封装的是普通输入项数据if (item.isFormField()) { // String name = item.getFieldName();// 解决普通输入项中文乱码问题// String value = item.getString("utf-8");// System.out.println("name:" + item.getFieldName() +// ",value:" + item.getString("utf-8"));// if (item.getFieldName().equals("loca")) { // String value = item.getString("utf-8");// Ipflag = Integer.parseInt(value);// System.out.println("name:" + "loca" + ",value:" + value);// }map.put(item.getFieldName(), item.getString("utf-8"));// 如果你页面编码是utf-8的// System.out.println("name:" + name + ",value:" + value);/** //按用户给资源分类 savePath = savePath + "\\" + value;* //按日期给资源分类(可将用户名和日期用于文件名中,以方便下载) Calendar cale =* Calendar.getInstance(); String year =* cale.get(Calendar.YEAR)+""; String month =* cale.get(Calendar.MONTH) + 1 +""; String day =* cale.get(Calendar.DATE)+""; savePath = savePath +* "\\" + year + "\\" + month + "\\" + day;*/} else {// 否则封装的是上传文件// 得到文件的上传名称String filename = item.getName();System.out.println(filename);if (filename == null || filename.trim().equals("")) { continue;}// 注意:不同浏览器提交的文件名称是不一样的,有的是带有文件路径的,而有的只有文件名// 截取路径,只获取文件名称filename = filename.substring(filename.lastIndexOf("\\") + 1);// 获取上传文件的后缀名,可用于验证上传文件是否合法String fileExtname = filename.substring(filename.lastIndexOf(".") + 1);// 获取item中文件上传的输入流InputStream in = item.getInputStream();// 得到文件的保存名称saveFilename = makeFilename(filename);// 得到文件的存储路径// 可重复上传同一文件,存储路径不一致// String saveFilepath = makePath(saveFilename, savePath);// 可重复上传同一文件,存储路径一致// String saveFilepath = makePath(filename, savePath);// 创建一个文件输出流FileOutputStream out = new FileOutputStream(tempfile + "\\" + saveFilename);// 创建一个缓冲区byte[] bytes = new byte[1024];int len = 0;while ((len = in.read(bytes)) != -1) { out.write(bytes, 0, len);}in.close();out.close();// 删除处理文件上传时生成的临时文件item.delete();message = "文件上传成功";