【问题标题】:Jersey FormData, upload multiple file dataJersey FormData,上传多个文件数据
【发布时间】:2015-11-15 21:50:11
【问题描述】:

我在 Jersey 写了一个 Rest Service 来上传多个文件。如下所示。但我想要 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 仅从表单中提取内容类型、文件名,而不是输入类型 name="" 属性。

任何帮助将不胜感激。

我正在使用 HTML 发布请求,如下所示。

同时发布 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>

【问题讨论】:

    标签: javascript java rest jersey


    【解决方案1】:

    问题是,@FormDataParam("file") 中的值名称。当您希望按名称提取所有部分时,您可以使用它。例如你可以有

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

    但如果你想自己遍历所有部分,你应该使用FormDataMultiPart 而不是List&lt;FormDataBodyPart&gt;。您可以获取地图,以名称为键。在FormDataBodyPart.getName() 中也提供了名称。例如

    @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();
    }
    

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

    【讨论】:

    • 嗨 PeesKilet..我也添加了我的 HTML,请你看看....似乎代码只返回我的“文件”和“文件”而不是名称属性,即元数据和文件文件
    • 您需要将它们作为部分附加。您只添加一个部分(“文件”部分)。 “元数据”和“文件”应该是不同的部分。
    • 在您的 Javascript 中,您还需要从每个输入元素的“名称”属性中获取值。您所做的只是附加一个硬编码的“文件”。在您的 HTML 中,您甚至没有名为“文件”的输入元素。它应该是循环内的formData.append(name, file)
    • 抱歉,请使用$(value).attr("name")。第二个问题是的。
    • 只需在循环外创建FormDataeach 函数)。然后在循环内只需将每个文件附加到它。在循环之后,发送请求。目前,您正在循环中执行所有操作,因此会为每个输入元素发送一个请求
    猜你喜欢
    • 2023-04-06
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多