如何为MultipartFile发送空值

时间:2014-11-28 12:35:09

标签: java javascript jquery angularjs spring-mvc

我正在使用angularJs和spring 4.0,

我的控制器代码:

@RequestMapping(value = "/endpoint/add", method = RequestMethod.POST)
public @ResponseBody GenericFormResponse execute(
    WebRequest wreq,
    @RequestParam("epName") String epName,
    @RequestParam("ipAddr") String ipAddr,
    @RequestParam("useDefault") String useDefault,
    @RequestParam("certFile") MultipartFile certFile) throws Exception {
    .....................
}

my js(angualrJs)代码:

var formData = new FormData();
formData.append("epName", $scope.epName);
formData.append("ipAddr", $scope.ipAddr);
formData.append("useDefault",$scope.defaultCert);
if(!$scope.defaultCert){
    formData.append("certFile", upFile);
}
$http({
    method: "POST",
    url: "./service/endpoint/add",
    data: formData,
    transformRequest: angular.identity,
    headers: {'Content-Type': undefined }
}).success(svcSuccessHandler)
  .error(svcErrorHandler);

我的问题是$scope.defaultCert=false POST请求工作正常,$scope.defaultCert = true我收到错误请求(400)

我也试过下面的事情,

if(!$scope.defaultCert){
    formData.append("certFile", upFile);
}else{
    formData.append("certFile", null);
}

我如何发送空MultipartFile。 感谢。

2 个答案:

答案 0 :(得分:0)

我在控制器中创建了两个服务,并为两个

创建了两个URL
@RequestMapping(value = "/endpoint/add-with-cert", method = RequestMethod.POST)
public @ResponseBody GenericFormResponse excecuteWithCert(
        WebRequest wreq,
        @RequestParam("epName") String epName,
        @RequestParam("ipAddr") String ipAddr,
        @RequestParam("useDefault") boolean useDefault,
        @RequestParam("certFile") MultipartFile certFile) throws Exception {
    LOGGER.debug("received request for endpoint creation with certificate");
    GenericFormResponse response = new GenericFormResponse();
    SessionManager sessionMgr = new SessionManager(wreq);
    if(!sessionMgr.isLoggedIn()) {
        response.setSuccess(false);
        response.setGlobalErrorCode("not_logged_in");
        return response;
    }
    ...............
}

@RequestMapping(value = "/endpoint/add", method = RequestMethod.POST)
public @ResponseBody GenericFormResponse excecuteWithOutCert(
        WebRequest wreq,
        @RequestParam("epName") String epName,
        @RequestParam("ipAddr") String ipAddr,
        @RequestParam("useDefault") boolean useDefault) throws Exception {
    LOGGER.debug("received request for endpoint creation  without certificate");
    ...............
}

在js文件中:

var url = "./service/endpoint/add";
if(!$scope.defaultCert){
    formData.append("certFile", upFile);
    url = "./service/endpoint/add-with-cert";
}       
$http({
method: "POST",
    url: url,
    data: formData,
    transformRequest: angular.identity, headers: {'Content-Type': undefined }
}).success(svcSuccessHandler)
.error(svcErrorHandler);

我不知道这是否正确,但它满足了我的要求。像我期待的那样工作。请提出最佳答案。

答案 1 :(得分:-1)

您需要正确配置以在Spring 4中启用多部分文件上载。

将以下行添加到应用程序初始化程序类:

dispatcher.setMultipartConfig(
        new MultipartConfigElement("/tmp", 25 * 1024 * 1024, 125 * 1024 * 1024, 1 * 1024 * 1024)
);

这里的dispatcher是ServletRegistration.Dynamic的一个实例

有关详细信息,请参阅this答案。