multipart/form-data post 方法提交表单,后台获取不到数据



这个和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=value2 

3.post方式(enctype为multipart/form-data,多用于文件上传) 
表单数据都保存在http的正文部分,各个表单项之间用boundary隔开。格式类似于下面这样:用request.getParameter是取不到数据的,这时需要通过request.getInputStream来取数据,不过取到的是个InputStream,所以无法直接获取指定的表单项(需要自己对取到的流进行解析,才能得到表单项以及上传的文件内容等信息)。这种需求属于比较共通的功能,所以有很多开源的组件可以直接利用。比如:apache的fileupload组件,smartupload等。通过这些开源的upload组件提供的API,就可以直接从request中取得指定的表单项了。

// 使用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;
}
// 设置上传单个文件的大小的最大值1M
upload.setFileSizeMax(1024 * 1024);
// 设置上传文件的总量的最大值10M
upload.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 = "文件上传成功";