当前位置: 首页 > 知识库问答 >
问题:

泽西FormData,上传多个文件数据

宋弘壮
2023-03-14

我在Jersey写了一个Rest服务来上传多个文件。如下图所示。但是我需要Restservice类中的属性名,即name=“metadata”和name=“file”。

        Select XML file 1: <input type="file" **name="metadata"** size="45" accept=".xml" />


        Select PDF file 2: <input type="file" **name="fileak**" size="45"  accept=".pdf" />

选择XML文件1:

选择PDF文件2:

@POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public Response uploadFile(
            @FormDataParam("file") List<FormDataBodyPart> parts) {
        for (FormDataBodyPart part : parts) {
            FormDataContentDisposition disp = part
                    .getFormDataContentDisposition();
            InputStream in = part.getValueAs(InputStream.class);
        }

        return Response.ok(" uploaded successfully !!").build();
    }

FormDataContentDisposition仅从表单中提取内容类型、文件名,而不是输入类型名称=“属性。

任何帮助都将不胜感激。

我张贴使用超文本标记语言的请求如下所示。

也发布HTML文件。

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta content="text/html;charset=utf-8" http-equiv="Content-Type" />
        <meta content="utf-8" http-equiv="encoding" />

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        <script type="text/javascript">

        $(document).ready(function()
        {
            $("#uploadBtn").click(function()
            {
                $('input[type="file"]').each(function(index, value)
                {   


                  var nameValue=value.attributes[0].value;
                  var file = value.files[0];

                    if(file)
                    {
                         var formData = new FormData();

                        formData.append('file', file); 
                        //formData["name"] = nameValue;

                        $.ajax({
                          url : '/publicationservice-web/v1/publication/upload',
                          type : 'POST',
                          data : formData,
                          cache : false,
                          contentType : false,
                          processData : false,
                          name:nameValue,
                          success : function(data, textStatus, jqXHR) {
                                var message = jqXHR.responseText;
                                $("#messages").append("<li>" + message + "</li>");
                          },
                          error : function(jqXHR, textStatus, errorThrown) {
                                $("#messages").append("<li style='color: red;'>" + textStatus + "</li>");
                          }
                        });
                    }
                });
            });
        });
        </script>
</head>
<body>
    <h1>NGBulletin Upload System - Metadata and PDF</h1>

    <form action="v1/publication/upload" method="post" enctype="multipart/form-data">

        <p>
            Select XML file 1: <input type="file" name="metadata" id="metadata" size="45" accept=".xml" />
        </p>
        <p>
            Select PDF file 2: <input type="file" name="fileak" id="fileak" size="45"  accept=".pdf" />
        </p>

        <p>
            <input id="uploadBtn" type="button" value="Upload PFD Files" />
        </p>

    </form>

    <ul id="messages">   
    </ul>

</body>
</html>

共有1个答案

谷梁承宣
2023-03-14

问题是,@FormDataParam(“文件”)中的值就是名称。当需要按名称提取所有零件时,可以使用此选项。例如,你可以

post(@FormDataParam("metadata") InputStream metaIn,
     @FormDataParam("metadata") FormDataContentDisposition metaFcd,
     @FormDataParam("fileak") InputStream fileakIn,
     @FormDataParam("fileak") FormDataContentDisposition fileakFcd) {
}

但是,如果您想自己遍历所有部分,应该使用FormDataMultiPart而不是List

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadAsset(FormDataMultiPart multipart) {

    Map<String, List<FormDataBodyPart>> map = multipart.getFields();

    for (Map.Entry<String, List<FormDataBodyPart>> entry : map.entrySet()) {

        for (FormDataBodyPart part : entry.getValue()) {
            InputStream in = part.getEntityAs(InputStream.class);
            String name = part.getName();
            System.out.println("--- name: " + name);
        }
    }
    return Response.ok("cool upload").build();
}

关键是,如果要使用@FormDataParamannatotion,那么尝试获取名称(以编程方式)是毫无意义的,因为您最终已经对名称(在注释值中)进行了硬编码,所以您已经知道了。

 类似资料:
  • 当我试图上传文件到泽西岛时,我发现下面有一些异常,请帮助我解决。谢谢 html文档:- 阿贾克斯:- Java代码:- 例外情况:- 2015年6月17日下午7:55:34组织。阿帕奇。卡塔琳娜。果心StandardWrapperValve调用 请求头:-

  • 我正在创建一个API上传文件使用泽西。 } } 当我执行curl-v-X POST时——form file=@rt.txt url 我哪里做错了?

  • 这里有很多链接建议使用多部分/表单数据,以及如何在这里上传文件。对于通过CURL命令上载的多个文件的组合,以及接受FormDataMultiPart的REST服务,无法真正找到一个。 当前正在使用的代码如下所示: 我尝试调用该服务的CURL是: 卷曲-X柱“http://localhost:37200/api/sample-批量“-H”接受:应用程序/json“-H”内容类型:多部分/表单数据“-

  • 我无法上传新泽西州的文件。使用泽西1.9。InputStream到达服务时为空。我尝试过将其作为普通表单提交和使用jQuery表单插件的AJAX提交,但结果都是一样的。也没有记录任何异常,这让它更加令人沮丧。 HTML表单 聚甲醛 Eclipse中的依赖层次结构显示mimepull.jar1.6也被引入。 剩下的服务 如果我添加@FormDataParam(“fileupload_name”)Fo

  • 问题内容: 我需要使用Laravel 5.1作为后端将图像和视频文件上传到Angular应用程序中的服务器。所有Ajax请求都需要首先发送到Laravel控制器,并且我们在这里有代码说明文件到达那里后如何处理。以前,我们已经完成了普通的HTML表单以将文件上传提交到控制器,但是在这种情况下,我们需要避免刷新表单的页面,因此我尝试通过Angular在Ajax中进行尝试。 我需要将以前通过HTML表单

  • 我是web服务新手,正在开发一个文档管理系统,并尝试使用Jersey restful web服务保存文件和多个对象。 我的网站。xml 运行此服务后,我面临以下错误 项目库是 所以,我找不到任何解决方案,是否有任何不同的方法可以通过一个rest调用上载具有多个对象的文件。 请在这方面指导我。