【java小白入门】servlet获取ajax传入的FormData参数

之前用springboot+mybatis做过excel文件上传,之后又尝试着用比较原始的servlet和ajax来实现文件上传的功能,两种方式的思想是一致的,只是在传参和获取参数的方式上有一些区别。

注意:servlet无法向springmvc或者springboot一样直接利用MultipartFile对象来获取上传的文件对象,需要得到文件的路径才能对其进行操作,而现代浏览器为了保护用户的隐私,直接获取表单文件域的值得到的是C:\fakepath\......因此在利用servlet做文件上传功能时需要进行最基本的两步:1将文件上传至服务器,2解析文件数据。

一、ajax前端传参

前端主要利用的是FormData这个对象,FormData对象可以根据传入的本身就存在的form表单来建立该表单的FormData对象,只要将你的form取id名为fileForm就可以利用下面这个例子中的方法来创建表单对象。通过append(key,value)方法来追加表单值,你可以传递任何合法的你需要传递给后端的参数。最后利用jquery的ajax方法即可发起请求。

function f_savedata_bak(){
    var formData = new FormData($('#fileForm')[0]);
    formData.append('userid','2');
    formData.append('header',["对方账号","交易时间","对方单位","转入金额"]);
    formData.append('tableName','T_CTRI_CW_YHRJZ_TEMP');
    formData.append('tableField',["C_ACCOUNTNO","C_JYSJ","C_KHMC","C_ZRJE"]);
    $.ajax({
        type:'post',
        url:getContextPath() + "/*.IMPXLS",
        data:formData,
        cache:false,
        processData: false,
        contentType: false,
    }).success(function(data){
        top.dhtmlx.alert({
            title:"成功",
            type: "alert",
            ok:   "确 定",
            text: "上传成功!",
            callback: function(){
                $("#btnSave").attr("disabled",false);
                window.returnValue = true;
                windowHandler.btnClose.click();
            }
        });
    }).error(function(){
        top.dhtmlx.alert({
            title: "错误",
            type:  "alert-error",
            ok:    "返 回",
            text:  "上传失败!\n"+msg,
            callback: function(){
                $("#btnSave").attr("disabled",false);
            }
        });
    });

}

二、servlet获取参数

在获取ajax传入的参数时由于无法获取到上传文件的绝对路径,因此需要先将文件上传至服务器,接着获取文件在服务器中的存储地址,最后才能对文件进行解析。在将文件上传至服务器的过程中用到了几个帮助类:DiskFileItemFactory,ServletFileUpload,FileItem,这几个类具体的API需要自行搜索。由于前端传入的参数有文件类型的也有其他类型的,因此在获取时也需要分情况进行处理,贴上将文件上传至服务器并获取参数的方法:

/**
     * @param request
     * 根据请求解析请求中的参数(文件与非文件)返回Map集合,并将文件上传至服务器
     * @return
     */
    private static Map getFilePath(HttpServletRequest request) {
        String upload_directory = "upload";
        String slash_directory = "/";

        // 上传配置
        int memory_threshold   = 1024 * 1024 * 3;  // 3MB
        int max_file_size      = 1024 * 1024 * 40; // 40MB
        int max_request_size   = 1024 * 1024 * 50; // 50MB


        // 配置上传参数
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
        factory.setSizeThreshold(memory_threshold);
        // 设置临时存储目录
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 设置最大文件上传值
        upload.setFileSizeMax(max_file_size);

        // 设置最大请求值 (包含文件和表单数据)
        upload.setSizeMax(max_request_size);

        upload.setHeaderEncoding("UTF-8");

        String uploadPath =  request.getContextPath()+slash_directory+upload_directory;
        String fileName="";
        String filePath="";
        // 如果目录不存在则创建
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        Map paramMap = new HashMap();

        try {
            // 解析请求的内容提取文件数据
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0) {
                // 迭代表单数据
                for (FileItem item : formItems) {
                    // 处理不在表单中的字段
                    if (!item.isFormField()) {
                        fileName = new File(item.getName()).getName();
                        filePath = uploadPath + slash_directory + fileName;
                        File storeFile = new File(filePath);
                        item.write(storeFile);
                        paramMap.put("fileName", fileName);
                        paramMap.put("filePath", filePath);
                    }else {
                        String value = item.getString("utf-8");
                        paramMap.put(item.getFieldName(), value);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
       /*Iterator<Map.Entry> entries = paramMap.entrySet().iterator();
	   while (entries.hasNext()) {
	     Map.Entry<Integer, Integer> entry = entries.next();
	     System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
	   }*/
        return paramMap;
    }

接着再调用此方法来获取ajax传入的参数,这里需要注意的是上一步的方法获取到都是字符串形式的参数,因此对于前端传入的数组类型的参数需要再转成数组类型:

Map impfileMap = getFilePath(request);//获取解析后的参数列表
String userid = impfileMap.get("userid").toString();//操作人
String headerStr = impfileMap.get("header").toString();//数组形式,需要转换
String tableName = impfileMap.get("tableName").toString();//表名
String tableFieldStr = impfileMap.get("tableField").toString();//数组形式,需要转换
String[] tHeader = headerStr.split(",");//字符串转为字符串数组
String[] tableField = tableFieldStr.split(",");//字符串转为字符串数组

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值