为什么MultipartHttpServletRequest的内容为空?

时间:2015-10-31 14:41:23

标签: angularjs spring spring-mvc file-upload multipartform-data

我尝试使用AngularJs上传2个文档。用户填写姓名,出生日期,性别等信息。如果这些数据通过弹簧控制器成功存储在数据库中,则应存储2个文件。

JS

以下代码用于添加和删除文档。

$scope.items = [];
$scope.item = {};

$scope.addItem = function (item)
    {   
          if ($scope.item.file != undefined){
              $scope.items.push( $scope.item);
              $scope.item = {};
          }
          else {
              alert("Please open a file before adding");
             }
     }
$scope.removeItem = function (item)
    {
         for (var i = 0; i < $scope.items.length; i++)
            {
                 if ($scope.items[i] === item)
                    {
                            $scope.items.splice(i, 1);
                            break;
                            }
            }
    }

以下代码用于提交表单数据和文档。

$scope.submit = function()
     { 
         var formData =
                {
                    fullName     : $scope.fullName,
                    fatherName   : $scope.fatherName,
                    gender       : $scope.gender,
                    contactNumber: $scope.contactNumber,
                    dateofbirth  : $scope.dateofbirth,
                    subDate      : new Date()
                };

        $http.post('userdetails', formData ).success(function(response)
            {
                if ($scope.items.length > 0)
                    {
                        for (var i = 0 ; i < $scope.items.length ; i++)
                          {
                                $scope.uploadItem(response.id, $scope.items[i]);
                          }
                    }  

            }).error(function(error)
                            {
                                alert(error);
                            });

    };

$scope.uploadItem = function(id, file)
{
       var data = new FormData();
       data.append('id', id);
       data.append('file', file);

       $http.post('multipleSave', data, {
             headers: { 'Content-Type': undefined,
                        enctype:'multipart/form-data' }

                     }).success(function(data) {
                        $log.debug("Upload Successfull");

                    }).error(function(error) {
                         $log.debug("Upload failure");
                     });
 };

将存储第一个表单数据,如果成功,则应传递Documents。这里id是自动生成的,在存储表单数据之后从数据库返回。所有这些都是从前端单击发生的。

Spring Controller

@RequestMapping(value = "/multipleSave", method = RequestMethod.POST)

public @ResponseBody void uploadFile(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException {

        Iterator<String> fileName=request.getFileNames();
        MultipartFile file= request.getFile(fileName.hasNext());
        System.out.println("file");
}

在Spring配置中

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>

我在调试模式下运行,我看到MultipartHttpServletRequest的内容为空。它没有收到任何文件。 对此有何帮助?

2 个答案:

答案 0 :(得分:0)

你有所有的配置。只需将控制器更新到下面

@RequestMapping(value = "/multipleSave", method = RequestMethod.POST)
public @ResponseBody void uploadFile(@RequestParam("file") MultipartFile[] files) throws IOException {

  for (int i = 0; i < files.length; i++) {
        MultipartFile file = files[i];
        // do something
  }
}

上传的文件应从MultipartFile的数组中提取,而不是从MultipartHttpServletRequest获取。

如果您需要任何进一步的信息/帮助,请在评论中说明。

参考 - 请参阅here

答案 1 :(得分:0)

我建议你的问题是在ajax标题中 - 我的工作实现的标题如下:

headers: {'Content-Type': undefined, 'Content-Transfer-Encoding': 'utf-8' }

您不应该同时使用内容类型和enctype。

另外,当我在spring-mvc中使用file.getOriginalFilename()方法时,它无法正常工作,因为表单名称编码是 iso-8859-1 。我认为,request.getFileNames()也行不通。我使用了以下方法:

MultipartFile file = request.getFile("file");
String fileName = new String(file.getOriginalFilename().getBytes("iso-8859-1"),"UTF-8");

此外,我发现您要通过formdata.append向档案附加其他参数。 没关系,但不要忘记使用单独的方法来获取params:从MultipartHttpServletRequest通过request.getFile/getFiles提取的文件,同时使用类似的东西提取其他参数:String id= request.getParameter("id");