如何同时提交同一表单的文件以及普通文本组件?
我们在提交表单时一定遇到过这个疑惑,在表单提交方式为post请求并且以二进制流方式提交文件时如何把附带的普通表单信息也传递过去并且获取呢?例如下图在上传文件时后台也需要得到对应的描述信息,但是我们提交过去的是二进制流啊,不是文本啊,所以思路就来了,我们拿到普通文本表单的流转化成文本不就行了。
Part是文件操作类,request.getParts()获取到的是复合表单中的所有的组件,每一个Part对象代表一个组件部分,那么问题来了,怎么区分提交的是文件还是文本,这时候就用到了他的一个方法getContentType()获取请求正文数据类型(mime类型)这样说可能有些抽象我们来看下这张表
我们先看下代码:
//获取所有表单提交组件的part对象
Collection<Part> parts = request.getParts();
//对他们遍历
for(Part p:parts) {
//(注意什麽都不选getContentType()是这个pplication/octet-stream)
if (p.getContentType() != null) {
//没选中文件大小为0
if(p.getSize()==0){
request.setAttribute("tip","您还没有选择文件!!!"); request.getRequestDispatcher("main/uploadF.jsp").forward(request,respons;
return;
}
//获取存储文件夹的真实路径
String path1 = request.getServletContext().getRealPath("upload");
String fileName1 = p.getSubmittedFileName();
allFile+="["+fileName1+"]"+"\n";
//获取路径,以及产生一个36位的随机id防止文件冲突
realPath = path1 + File.separator + UUID.randomUUID() + fileName1;
pp = p;
//将文件上传到指定路径
pp.write(realPath);
//上传时将信息保存下来(上传者id,上传时间,上传文件名,上传文件绝对路径,)
//普通表单的getContentType()为null
} else if (p.getContentType()== null) {
//如果描述里写了东西
if(p.getSize()>0){
String name = p.getName();
//获取普通表单的二进制流() 重点!!!!!!!
InputStream inputStream = p.getInputStream();
//定义缓存数组
byte[] b = new byte[1024];
//将流读入到数组并且记录读取长度
int len = inputStream.read(b);
//将字节数组转化为字符串
String d = new String(b, 0, len);
display = d;
inputStream.close();
}
上面代码是我一个文件管理系统项目的部分代码,后面我会贴出源码:
思路是这样的我们获取了所有的表单组件的Part对象,然后通过判断miei类型是否为空区分文件还是普通表单控件,然后文件正常读写,普通组件内容文本通过输入流写入到数组然后通过String中的一个构造器String(byte[]b,0,len)转化为字符串即可;
看一下效果:
这个项目是用jsp做的,后面我会把发到博客上。