【问题标题】:JAX-RS FileUpload with Apache CXF使用 Apache CXF 上传 JAX-RS 文件
【发布时间】:2014-09-11 15:53:10
【问题描述】:

我正在尝试使用 JAX-RS 和 TomEE 的 Apache CXF 实现 (2.6.14) 上传文件,但上传的文件始终为空。

代码如下:

  @POST
  @Path("/upload")
  @Consumes(MediaType.MULTIPART_FORM_DATA)
  public Response uploadFile(@Multipart(value = "file") @NotNull Attachment attachment) throws UnsupportedEncodingException {
    try {

      System.out.println(attachment);

      return Response.ok("file uploaded").build();

    } catch (Exception ex) {
      logger.error("uploadFile.error():", ex);
      return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
    }
  }

还有一个非常容易上传的 HTML 文件:

<form action="http://127.0.0.1:8080/eegrating/restapi/cashflowparameter/upload" method="post" enctype="multipart/form-data">
    <p>File:<br>
        <input name="file" type="file" size="50" maxlength="100000" accept="text/*">
        <input type="submit" name="Submit" value="Send">
    </p>
</form>

请求头看起来不错:

------WebKitFormBoundaryOCleIjB2JgeySK0w 内容处置:表单数据;名称=“文件”;文件名="git.txt" 内容类型:文本/纯文本

但附件始终为空。有什么建议?提前致谢。

【问题讨论】:

  • 你得到了吗,问题出在哪里? @VWeber

标签: java web-services rest jakarta-ee cxf


【解决方案1】:

首先,您是否将 Apache TomEE 与 JAX-RS 结合使用?如果不是,您应该这样做,因为它捆绑了 JAX-RS。 试试这个代码。我正在使用 CXF 的特定功能,我测试过并且效果很好。这个资源只是产生一个 HTML 结果,你当然可以调整它。如您所见,我引用了提供的 CXF 依赖项,因为 TomEE 包含它。我正在发布每个需要的文件。

没有 web.xml 文件。

META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/FileUpload_2"/>

index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <form method="POST" enctype="multipart/form-data"
              action="/FileUpload_2/web/upload">
            File to upload: <input type="file" name="upfile"><br/>
            Notes about the file: <input type="text" name="note"><br/>
            <br/>
            <input type="submit" value="Press"> to upload the file!
        </form>

    </body>
</html>

上传.MyApplication.java

package upload;

import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

@ApplicationPath("web")
public class MyApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        return new HashSet<Class<?>>(Arrays.asList(UploadResource.class  ));
    }

}

upload.UploadResource.java

package upload;
import java.io.*;
import java.nio.file.*; 
import javax.ws.rs.*;
import javax.ws.rs.Path;
import javax.ws.rs.core.*;
import org.apache.cxf.jaxrs.ext.multipart.*; 

public class UploadResource {

    @POST
    @Path("/upload")
    @Produces(MediaType.TEXT_HTML)
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public String uploadFile(@Multipart("note") String note, 
     @Multipart("upfile") Attachment attachment) throws IOException {

       String filename = attachment.getContentDisposition().getParameter("filename");

        java.nio.file.Path path = Paths.get("c:/" + filename);
        Files.deleteIfExists(path);
        InputStream in = attachment.getObject(InputStream.class);

       Files.copy(in, path);
       return "uploaded " + note;  
    }                        

}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mycompany</groupId>
    <artifactId>FileUpload_2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>FileUpload_2</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>2.6.14</version>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.xml.bind</groupId>
                    <artifactId>jaxb-impl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.ws.rs</groupId>
                    <artifactId>jsr311-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>wsdl4j</groupId>
                    <artifactId>wsdl4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.ws.xmlschema</groupId>
                    <artifactId>xmlschema-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.codehaus.woodstox</groupId>
                    <artifactId>woodstox-core-asl</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.geronimo.specs</groupId>
                    <artifactId>geronimo-javamail_1.4_spec</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-rt-transports-http</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-rt-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-rt-bindings-xml</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>6.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

【讨论】:

    【解决方案2】:

    对于 cxf 特定(不是球衣),您的代码可能如下所示

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(MultipartBody body) throws UnsupportedEncodingException {
       try {
          for(Attachment attachment : body.getAllAttachments()){
              System.out.println(attachment);
          }
          return Response.ok("file uploaded").build();
    
       } catch (Exception ex) {
           logger.error("uploadFile.error():", ex);
           return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
       }
    }
    

    您的代码不起作用,因为我们必须将特定的contentId 传递给@Multipart。代码如下所示

    注意*:contentId 不是您从客户端发送的文件属性名称

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(@Multipart(value="spcfic contentId", type="application/octet-stream") Attachment attachment) throws UnsupportedEncodingException {
        ...
        ...
    }
    

    我建议使用MultipartBody 而不是@Multipart

    参考:http://cxf.apache.org/docs/jax-rs-multiparts.html

    我会很高兴任何改进或纠正帖子的内容:)

    【讨论】:

    • 我正在使用类似的方法。但是,我在 AttachmentUtils.getAttachments Property name = "org.apache.cxf.jaxrs.attachments.inbound" (MultipartBody)mc.get(propertyName); 处收到空指针异常 - 这正在返回 null 我在这里缺少什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多