同时提交同一表单的文件以及普通文本组件

如何同时提交同一表单的文件以及普通文本组件?

我们在提交表单时一定遇到过这个疑惑,在表单提交方式为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做的,后面我会把发到博客上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值