Java RESTful文件上传问题

时间:2011-07-19 16:44:44

标签: java spring rest file-upload

我现在正在学习REST和Spring,我必须做一些启动项目,以便熟悉这些技术。所以,我在一些教程之后创建了一个RESTful应用程序,并且在将文件上传到服务时遇到了一些问题。

当我在FileUpload.html的上下文菜单中点击eclipse中的Run On Server选项时,它会给我一个HTTP状态404 - Not Found。我运行html文件,但无法找到它。我不明白为什么。我不得不说其他行为,比如@GET正常运作。因此,当我从浏览器访问GET方法的某些地址时,它可以工作。所以如果你知道某些事情,请告诉我,因为我真的不明白。感谢

这是GalleryResource类:

@Path("/locations")
public class GalleryResource {
    private GalleryService galleryService = new PicturesGalleryService();

    @POST
    @Path("/upload")
    @Consumes("multipart/form-data")
    public Response uploadFile(
            @FormDataParam("file") InputStream uploadedInputStream,
            @FormDataParam("file") FormDataContentDisposition fileDetail) {

        String newFile= "c:/gallery/"
                + fileDetail.getFileName();

        FileUtiles.createNewPicture(newFile);

        String output = "File uploaded to : " + uploadedFileLocation;

        return Response.status(200).entity(output).build();

    }
}

以下是示例网页:

<html>
<body> 
    <form action="http://localhost:8080/locations/upload" method="post" enctype="multipart/form-data">

      <input type="file" name="file"/> 
      <input type="submit" value="Upload File" />
    </form> 
</body>
</html>

这是我项目的目录树:

enter image description here

web.xml文件:

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Restful Web Application</display-name>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.rest.sample.resources</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

.project文件:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="build/classes" path="src/main/java"/>
    <classpathentry kind="src" output="build/resource" path="src/main/resources"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v7.0">
        <attributes>
            <attribute name="owner.project.facets" value="jst.web"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="output" path="build/classes"/>
</classpath>

.classpath文件:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="build/classes" path="src/main/java"/>
    <classpathentry kind="src" output="build/resource" path="src/main/resources"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
    <classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v7.0">
        <attributes>
            <attribute name="owner.project.facets" value="jst.web"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="output" path="build/classes"/>
</classpath>

3 个答案:

答案 0 :(得分:0)

你得到一个日志条目说它加载了GalleryResource吗?另外,如果您将@Path(“/ locations”)更改为使用@GET的类中的唯一内容,它是否有效?因此将其更改为@Path(“/ locationsUpload”)。我之前遇到过使用相同路径条目的多个文件的问题。

答案 1 :(得分:0)

你确定:

  

http://localhost:8080/locations/upload

是对的吗?

并且不应在资源路径之前包含项目的名称,例如:

  

http://localhost:8080/RESTservice/locations/upload

答案 2 :(得分:0)

它是一个弹簧网络应用程序吗?

我失踪了:

  • spring web配置文件(在大多数情况下是一个单独的文件,但有时包含在applicationContext.xml中)
  • 配置并启动spring的web.xml部分

您是否真的尝试从HTML文件启动服务器? - 我之前从未见过这个选项。 - 我总是将应用程序添加到服务器并从“服务器”视图启动服务器(Eclipse Alt-3 +“服务器”)