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

Java 如何在AngularJs中单击提交按钮时发送所选文件列表,java,angularjs,jersey,ng-file-upload,Java,Angularjs,Jersey,Ng File Upload,我正在使用将文件发送到服务器。ng-file-upload可以完美地逐个上载文件。我正在使用最新的chrome浏览器 示例代码片段 在这里,当在文件输入中选择文件时,文件将上载到服务器。但我想要的是,只有在单击提交按钮以及其他表单数据时,文件(选定的文件数组)才应上载到服务器 球衣休息服务 @POST @Path("/manual") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APP

我正在使用将文件发送到服务器。ng-file-upload可以完美地逐个上载文件。我正在使用最新的chrome浏览器

示例代码片段

在这里,当在文件输入中选择文件时,文件将上载到服务器。但我想要的是,只有在单击提交按钮以及其他表单数据时,文件(选定的文件数组)才应上载到服务器

球衣休息服务

    @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新手,请帮助我解决这个问题。

根据我的预期,您可以将上传功能附加到按钮上,并像执行任何其他功能一样触发它。这是关于ng文件上载的GitHub文档中的一个示例:

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}, ...})...;
      }
    }
}]);
app.controller('MyCtrl',['$scope','Upload',函数($scope,Upload){
//稍后在表单提交或类似内容上上载
$scope.submit=函数(){
if(form.file.$valid&&$scope.file){
$scope.upload($scope.file);
}
};
//在文件上上载选择或删除
$scope.upload=函数(文件){
上传({
url:“上传/url”,
数据:{file:file,‘username’:$scope.username}
}).然后(功能(resp){
console.log('Success'+resp.config.data.file.name+'upload.Response:'+resp.data);
},功能(resp){
console.log('错误状态:'+响应状态);
},函数(evt){
var progressPercentage=parseInt(100.0*evt.loaded/evt.total);
log('progress:'+progressPercentage+'%'+evt.config.data.file.name);
});
};
//对于多个文件:
$scope.uploadFiles=函数(文件){
if(files&&files.length){
对于(var i=0;i
在这里,您可以看到,当调用表单$scope.submit时,他正在调用$scope.upload函数,而且他甚至在调用upload之前检查表单是否有效。

根据和我所期望的,您可以将upload函数附加到按钮上,并像执行任何其他函数一样触发它。这是关于ng文件上载的GitHub文档中的一个示例:

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}, ...})...;
      }
    }
}]);
app.controller('MyCtrl',['$scope','Upload',函数($scope,Upload){
//稍后在表单提交或类似内容上上载
$scope.submit=函数(){
if(form.file.$valid&&$scope.file){
$scope.upload($scope.file);
}
};
//在文件上上载选择或删除
$scope.upload=函数(文件){
上传({
url:“上传/url”,
数据:{file:file,‘username’:$scope.username}
}).然后(功能(resp){
console.log('Success'+resp.config.data.file.name+'upload.Response:'+resp.data);
},功能(resp){
console.log('错误状态:'+响应状态);
},函数(evt){
var progressPercentage=parseInt(100.0*evt.loaded/evt.total);
log('progress:'+progressPercentage+'%'+evt.config.data.file.name);
});
};
//对于多个文件:
$scope.uploadFiles=函数(文件){
if(files&&files.length){
对于(var i=0;i

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

我决定写一个描述性的答案,说明如何将多个文件发送到后端并逐个访问文件详细信息。缺少信息性答案在互联网上有关于这个问题的信息,所以这个答案可能对某些人有帮助。要用AngularJs向后端发送多个文件,你可以使用API。你可以在单击提交按钮时发送文件,就像上面提到的答案一样。假设你的前端工作正常,可以向服务器发送文件。所以大多数人对如何操作文件和如果是多部分表单数据,则提供其他详细信息。以下是操作表单数据的方法

服务器端收到的数据如下所示

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

{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());
       }
     }
   }
 }
@POST
@使用(MediaType.MULTIPART\u FORM\u数据)
公共无效上载(FormDataMultiPart formParams){
Map fieldsByName=formParams.getFields();
for(列表字段:fieldsByName.values()){
for(FormDataCodePart字段:字段){
//检查字段是否为文件(如果有人知道检查文件的更好解决方案[],请分享您的答案)
如果(StringUtils.equals)(“文件”,
StringUtils.substringBefore(field.getName(),“[”)){
//读取文件内容
InputStream is=field.getEntityAs(InputStream.class);
字符串文件名=field.getName();
field.getMediaType();//文件mimeType
//获取文件详细信息,如大小、文件名等
FormDataContentDisposition f=field.getFormDataContentDisposition();
System.out.println(f.getFileName());
注意:f.getType()不返回实际的文件类型。它将mime类型作为表单数据返回,以获取实际的mime类型。请使用上述FormDataCodePart媒体类型。
}
获取其他表单数据,如用户名
else if(StringUtils.equals(field.getName(),“userName”)){
System.out.println