在 AngularJs 中单击提交按钮时如何发送选定的文件列表

How to send selected file list when submit button click in AngularJs

我正在使用 ng-file-upload 将文件发送到 server.ng-file-upload 与 one.I 上传文件完美配合,我正在使用最新的 chrome 浏览器。

示例代码片段

jsfiddle

在文件中选择文件时,文件会上传到服务器 input.But 我想要的是,当提交按钮被点击时,文件(选定的文件数组)应该只上传到服务器其他表格数据。

泽西 REST 服务

    @POST
    @Path("/manual")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public boolean insertResults(@FormDataParam("file") InputStream uploadedInputStream,@FormDataParam("file") FormDataContentDisposition fileDetail,@FormDataParam("username") String username) throws IOException {

        System.out.println(username);

        StringWriter writer = new StringWriter();
        IOUtils.copy(uploadedInputStream, writer,"UTF-8");
        String theString = writer.toString();
        System.out.println(theString);

            return Boolean.TRUE;

}

我是 AngularJs 的新手,请帮助我解决这个问题。

根据 documentation on the site 和我的预期 - 您可以将上传功能附加到按钮并像执行任何其他功能一样触发它。这是 GitHub 文档中关于 ng-file-upload:

的示例
app.controller('MyCtrl', ['$scope', 'Upload', function ($scope, Upload) {
    // upload later on form submit or something similar
    $scope.submit = function() {
      if (form.file.$valid && $scope.file) {
        $scope.upload($scope.file);
      }
    };

    // upload on file select or drop
    $scope.upload = function (file) {
        Upload.upload({
            url: 'upload/url',
            data: {file: file, 'username': $scope.username}
        }).then(function (resp) {
            console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);
        }, function (resp) {
            console.log('Error status: ' + resp.status);
        }, function (evt) {
            var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
            console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
        });
    };
    // for multiple files:
    $scope.uploadFiles = function (files) {
      if (files && files.length) {
        for (var i = 0; i < files.length; i++) {
          Upload.upload({..., data: {file: files[i]}, ...})...;
        }
        // or send them all together for HTML5 browsers:
        Upload.upload({..., data: {file: files}, ...})...;
      }
    }
}]);

在这里你可以看到他在调用表单 $scope.submit 时调用了 $scope.upload 函数,而且他甚至在调用上传之前检查表单是否有效。

我决定写一篇关于如何将多个文件发送到后端并通过 one.There 访问文件详细信息的描述性答案,互联网上缺乏关于此的信息性答案,所以这个答案可能对someone.To 将 AngularJs 中的多个文件发送到后端你可以使用 ng-file-upload API.You 可以像上面提到的那样在提交按钮单击时发送文件 answer.Let 假设你的前端是工作完美,可以将文件发送到 server.So 如果它是一个多部分表单,你们中的大多数人对如何操作文件和其他细节有疑问 data.Here 是如何操作表单数据的方式。

服务器端收到如下数据。

示例文件数据以及其他表单属性

{files[0]=[org.glassfish.jersey.media.multipart.FormDataBodyPart@40ce14c9],files[1]=[org.glassfish.jersey.media.multipart.FormDataBodyPart@40ce14c9],userName=sam}

REST 端点(使用 Jersey)来操作多部分表单数据

  @POST
  @Consumes(MediaType.MULTIPART_FORM_DATA)
  public void upload(FormDataMultiPart formParams){

    Map<String, List<FormDataBodyPart>> fieldsByName =   formParams.getFields();

       for (List<FormDataBodyPart> fields : fieldsByName.values()) {
            for (FormDataBodyPart field : fields){

 // Check if fields are files(If any one knows better solution to check files[] please share your answers)

                if (StringUtils.equals("files",
                  StringUtils.substringBefore(field.getName(), "["))) {

                    //To read file content
                    InputStream is = field.getEntityAs(InputStream.class);
                    String fileName = field.getName();
                    field.getMediaType();//File mimeType

                    //To get file details like size,file name,etc
                    FormDataContentDisposition f=field.getFormDataContentDisposition();
                    System.out.println(f.getFileName());

    Note: f.getType() not return the actual file type it returns mime type as   form-data to get actual mime type use FormDataBodyPart media type like above.
     }

    get other form data like user name

  else if(StringUtils.equals(field.getName(),"userName")){

          System.out.println(field.getValue());
       }
     }
   }
 }