博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
multipart/form-data post 方法提交表单,后台获取不到数据
阅读量:4520 次
发布时间:2019-06-08

本文共 4218 字,大约阅读时间需要 14 分钟。

这个和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中取得指定的表单项了。

//1、创建一个DiskFileItemFactory工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。 factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB //2、创建一个文件上传解析器 ServletFileUpload upload = new ServletFileUpload(factory); List
list = 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;
}
// 设置上传单个文件的大小的最大值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 = "文件上传成功";

 

转载于:https://www.cnblogs.com/youqc/p/9647258.html

你可能感兴趣的文章
正则表达式之 数据验证 与 文本替换
查看>>
php小程序-文章发布系统
查看>>
从“智猪博弈”看所谓“大国责任”
查看>>
Day3:Spring-JDBC、事务管理
查看>>
模块的四种形式
查看>>
Jmeter属性和变量
查看>>
java并发编程:并发容器之CopyOnWriteArrayList(转)
查看>>
python基础——面向对象进阶下
查看>>
Linux vi 命令详解
查看>>
本地如何搭建IPv6环境测试你的APP
查看>>
C++ NULL与nullptr的区别
查看>>
vim配置成c++IDE
查看>>
利用node搭建本地服务器
查看>>
python pickle命令执行与marshal 任意代码执行
查看>>
Elasticsearch 2.3 java api
查看>>
golang写入csv
查看>>
基础2
查看>>
java基础篇---网络编程(UDP程序设计)
查看>>
Kafka Producer相关代码分析【转】
查看>>
LeetCode 121. Best Time to Buy and Sell Stock
查看>>