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

    //1、创建一个DiskFileItemFactory工厂
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
    factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
    //2、创建一个文件上传解析器
    ServletFileUpload upload = new ServletFileUpload(factory);
    List<FileItem> list = upload.parseRequest(request);
    Map<String, String> resultMap = new HashMap<String, String>();
    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
Copyright © 2020-2023  润新知