通过REST服务上传文件

3
我希望使用restservice上传文件,我在网上找到了很多资料,但仍然无法解决我的问题。可能是因为我在Rest服务中使用了Spring?!以下是我的代码:

HTML

<input type="button" value="Upload document" id="button">
<input id="fileToUpload" type="file">

JQUERY
jQuery("document").ready(function () {
    $("#button").on("click", function () {

          var fileInput= $('input[name="fileInput"]')[0].files[0]; 
          var data = new FormData();
          data.append('file', fileInput);
          $.ajax({
            url: '.../upload',
            type: 'POST',
            data: data,
            cache: false,
            contentType: false,
            processData: false,
            success: function(data){
                alert("successfully.");
            },
            error: function(data){
                alert("failed.");
            }
          });
    });
});

JAVA(RESTSERVICE)
@RequestMapping(value = "/upload", method = { RequestMethod.POST }, produces = { MediaType.MULTIPART_FORM_DATA_VALUE,
        MediaType.APPLICATION_FORM_URLENCODED_VALUE, MediaType.APPLICATION_JSON_VALUE })
public void uploadingFile(@RequestBody InputStream uploadedInputStream) throws IOException {
    System.out.println("uploadedInputStream: " + uploadedInputStream);
}

异常

 Servlet.service() for servlet REST API Dispatcher threw exception: java.lang.IllegalStateException: Parameters processing failed.

我的REST服务没问题吧?找不到我的错误 :(

POM.XML

<!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

APPLICATION-CONTEXT.XML

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">


<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="50000000" />
</bean>


解决方案

JAVA(RESTSERVICE)

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
public void uploadingFile(@RequestParam("file") MultipartFile uploadedInputStream) throws IOException {
    System.out.println("...the parameter binding works now");
}

JAVA(SPRING CONFIG)
@Bean
public static CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver cmr = new CommonsMultipartResolver();
    cmr.setMaxUploadSize(50000000);
    return cmr;
}

(备选 - APPLICATION.XML)

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="50000000" />
   </bean>

请查看https://dev59.com/Jl8e5IYBdhLWcg3wS4-5,该网页关于Spring文件上传RESTful Web服务的问题。 - seenukarthi
嗯,我将REST服务中的参数类型从"InputStream"更改为"MultipartFile",并且在jQuery中将内容类型从"application/x-www-form-urlencoded"更改为"multipart/form-data"。出现的异常是:"java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?"。在application.xml文件中添加"<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>"并没有解决这个问题... - Louisa
你可以将contentType属性设置为false。 - nnunes10
谢谢,我已经更改了它...但仍然存在相同的问题:“java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?” - Louisa
1个回答

2
您的处理程序方法应该像下面这样:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void uploadingFile(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException {

    Iterator<String> itr =  request.getFileNames();

    MultipartFile file = request.getFile(itr.next());
    System.out.println(file.getOriginalFilename() +" uploaded!");
}

不要忘记在你的应用程序上下文中添加以下行:
<mvc:annotation-driven />

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="1048576"/>
</bean>

我改变了我的方法 - 但现在我有下一个异常:“Expected MultipartHttpServletRequest:是否配置了MultipartResolver?” 在我的application.xml中,我添加了:“<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bea‌​n>”。 - Louisa
它应该可以工作。你能否添加一下你的应用上下文? - nnunes10
此外,您需要commons-io.jar库 ;) 您可以尝试一下吗? - nnunes10
以上是应用程序上下文和pom.xml的一部分。其中包含commons-io.jar。 - Louisa
在您的帮助下解决了这个问题!最终错误是应用程序上下文文件application-context.xml的逻辑存储在Java类中,而不是xml本身。 - Louisa
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接