enctype="multipart/form-data"方式提交表单数据的问题

  • 该方式提交表单数据以什么形式传递给服务器?抓包分析
image.png
  • 1 这种方式发送到服务器的数据,需要一些其他方法处理才能还原原貌。先通过基本套路拿到处理的对象upload
public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 拿到一个文件长传类的工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // Set factory constraints
        factory.setSizeThreshold( 1024*1024*5);
        // Configure a repository (to ensure a secure temp location is used)
        //文件上传的时候的临时文件夹 
        ServletContext servletContext = this.getServletConfig().getServletContext();
        File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
        //把临时文件夹给到Factory使用
        factory.setRepository(repository);
        // Create a new file upload handler  使用工厂获取一个文件上传处理器
        ServletFileUpload upload = new ServletFileUpload(factory);
        // Set overall request size constraint
        upload.setSizeMax(1024*1024*10);
}
  • 2得到数据列表,分别解析,得到表单基本数据和文件,因为浏览器发过来的时候会给与区分基本表单和文件
// Parse the request 解析请求
        try {
            List<FileItem> items = upload.parseRequest(request);
            
            for (FileItem fileItem : items) {
                
                    if (fileItem.isFormField()) { //simple form field.
                        processFormField(fileItem);  // 基本的表单数据    文件除外
                    } else {
                        processUploadedFile(fileItem);// 该item是一个文件数据
                    }
            }
            
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
  • 3处理基本表单数据方法为
private void processFormField(FileItem item) {
        String fieldName = item.getFieldName();
        byte[] bs = item.get();
        String value = new String(bs);
        switch (fieldName) {
        case "username":
            user.setUsername(value);
            break;
        case "password":
            user.setPassword(value);
            break;
        case "gender":
            user.setGender(value);
            break;
        case "age":
            user.setAge(value);
            break;
        case "email":
            user.setEmail(value);
            break;
        default:
            break;
        }
    }
  • 4
private void processUploadedFile(FileItem item) {
        //把该文件保存起来
        String fieldName = item.getFieldName(); //表达名
        String fileName = item.getName(); //文件名
        
        InputStream uploadedStream=null;
        try {
            uploadedStream = item.getInputStream();
            String filename =new Random().nextInt(1000)+fileName ;
            //文件夹的realPath
            String realPath = getServletContext().getRealPath("pic");
            File file = new File(realPath);
            if (!file.exists()) {
                file.mkdir();
            }
            String fileString = realPath+"/"+filename;
            File picFile = new File(fileString);
            
            user.setPic("pic/"+filename);//为了存储到xml中
            FileOutputStream fos = new FileOutputStream(picFile);
            
            byte [] bs=new byte[1024];
            int length=0;
            while( (length=uploadedStream.read(bs))!=-1){
                fos.write(bs, 0, length);
            }
            fos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if (uploadedStream!=null) {
                try {
                    uploadedStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
  • 4表单没有这个属性提交的就比较常规
image.png

这种方式就可以使用一些工具比如BeanUtils对表单数据进行封装

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,735评论 0 17
  • 本文包括:1、文件上传概述2、利用 Commons-fileupload 组件实现文件上传3、核心API——Dis...
    廖少少阅读 12,668评论 5 91
  • 清早的鸟鸣,在许多地方渲染着晨色我从故旧的梦里,寻了爱情醒来 我知道河水怎样流漾山谷怎样迎来黎明晨风怎样把原野吹得...
    余上仙阅读 390评论 16 15
  • 节后归,游子去,今日离,临别重重寄语有思于此。 溪水梧桐风啸,征铎马路人寥。 晨炊客行响离谣,惊得枝上数鸟。 不语...
    立小笳阅读 315评论 2 9