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

Spring REST MultipartFile文件始终为空

公西博实
2023-03-14

我正在尝试使用REST服务设置一个简单的html和Spring 3.0.6上传。我已经在线学习了本教程,但MultipartFile参数始终为空。以下是配置和代码:

application-context.xml:

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

pom.xml:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.1</version>
</dependency>
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.2.2</version>
</dependency>

html:

<html>
    <head>
        <title>Upload a file please</title>
    </head>
    <body>
        <h1>Please upload a file</h1>
        <form method="post" action="/site/restServices/artworkUpload/" enctype="multipart/form-data">
            <input type="text" name="name"/>
            <input type="file" name="file"/>
            <input type="submit"/>
        </form>
    </body>
</html>

Rest控制器:

@POST
@Path("/artworkUpload")
public String uploadFile(@RequestParam("name") String name,
    @RequestParam("file") MultipartFile file) {
    try {
        if (!file.isEmpty()) {
            byte[] bytes = file.getBytes();
            // store the bytes somewhere
            return "redirect:uploadSuccess";
        } else {
            return "redirect:uploadFailure";
        }
    }
    catch (Exception ex)
    {

    }
    return null;
}

我复制了Spring教程中的示例,但无论我做了什么更改,file参数始终为null。“名称”将在文本框中具有值,但文件将为空。

我也尝试过使用Jersey,收到了文件的InputStream,但FormDataContentDisposition为null,因此无法确定文件类型。

这也在Jetty上运行。

我错过了什么?

共有2个答案

惠洛华
2023-03-14

它帮助我连接了这个库:

 <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

所有库:

<dependencies>
    <!-- Spring 3 MVC  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.1.2.RELEASE</version>
    </dependency>
    <!-- Apache Commons file upload  -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.2</version>
    </dependency>
    <!-- Apache Commons IO -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
    <!-- JSTL for c: tag -->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

看见http://viralpatel.net/blogs/spring-mvc-multiple-file-upload-example/

段劲
2023-03-14

我记得,我通过在构建路径中添加附加库解决了相同的问题:

commons-fileupload-1.2.2.jar
commons-io-2.1.jar

我希望这对你有帮助。

编辑

好的。我终于有时间讨论这个问题了。首先,为什么你使用标准的java功能来构建rest服务(注释@POST,@Path)?因为对于Spring,最好使用Spring MVC期货进行REST。互联网上有很多关于这方面的信息。这是参考留档中的特殊部分。这里还有IBM网站上的好文章。关于如何使用Spring MVC构建REST控制器的非常好的描述也在Spring in Action(最后的3-d版)中。

下面是我如何实现简单的文件上传功能:

Rest控制器:

@Controller
@RequestMapping("/rest/files")
public class FilesController {
        ...

        @RequestMapping(value="/rest/files", method=RequestMethod.POST)
        public String uploadFile(@RequestParam("name") String name,
                @RequestParam("file") MultipartFile file) {
            try {
                if (!file.isEmpty()) {
                    byte[] bytes = file.getBytes();
                    // store the bytes somewhere
                    return "redirect:uploadSuccess";
                } else {
                    return "redirect:uploadFailure";
                }
            }
            catch (Exception ex)
            {

            }
            return "/testFileDownload";
        }
}

html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test file upload</title>
</head>
<body>
    <h1>Please upload a file</h1>
    <form method="post" action="rest/files" enctype="multipart/form-data">
        <input type="text" name="name" /> <input type="file" name="file" /> <input
            type="submit" />
    </form>
</body>
</html>

在dispatcher-servlet.xml中查看解析器配置:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
            <map>
                <entry key="file" value="multipart/form-data"/>
                <entry key="html" value="text/html"/>
            </map>
        </property>
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/views/"/>
                    <property name="suffix" value=".jsp"/>
                </bean>
            </list>
        </property>
    </bean>

我希望我没有浪费我的时间,这对你来说仍然是必要的。)

编辑2

这是一个非常好的教程,描述了如何用Spring 3.1构建RESTful web服务。

 类似资料:
  • 下面是片段。请注意,我已经恢复到以前的提交,因此丢失了最近的修改,但请查看我编写的代码,然后才注意到始终等于0() 以下是当检测到活动后按: 以下是NoteActivity接收结果调用的方式。 null 我在我的项目上浪费了很多重要的时间,只是想知道是什么使resultCode和requestCode的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!

  • 返回NULL。在选择JTabbedPane旁边的一个JPanel后直接调用它,这是我能想到的方法返回空组件的唯一原因;因为选项卡已打开但没有焦点。 然而,我需要找到一种方法来获得JTabbedPane中打开的选项卡。 而且,始终返回NULL。有6个标签。 getSelectedIndex()返回了正确的索引,但如果我传入该索引,它仍然表示组件为null。

  • 我有两个不同的活动,在第一个活动中,我在一些EditText中输入一些信息,然后进入第二个活动,但当我返回时,第一个活动中EditText上的文本消失了。 以下是第一个活动的OnCreate() 我正在使用onSaveInstanceState方法保存信息 在进行调试时,我可以看到确实在onSaveInstanceState方法中填充了savedInstanceState捆绑包,但在OnCreat

  • 我将Spring Boot版本='1.4.0.rc1'与Spring Boot Stormpath 1.0.2一起使用。 我试图使用多部分文件上传,但MultipartFile在控制器中总是为空。 这是控制器,在下面的代码中,总是成功,总是失败: 我的集成测试使用改型: 我使用自动配置,所以我唯一的自定义配置类配置StormPath: 更新:这是传出请求。我不确定如何在多部分解析器本身中启用日志记

  • 问题内容: 我正在编写一个C#ASP.Net MVC应用程序,供客户端将文件发布到其他服务器。我正在使用通用处理程序来处理从客户端到服务器的发布文件。但是在我的处理程序中,System.Web.HttpContext.Current.Request.Files始终为空(0个计数)。 表格代码: 处理程序: 请帮我。谢谢。 问题答案: 最后,我发现了问题。 由于某些原因,控制器中的代码永远无法正常工

  • 问题内容: 我使用firefox 3.6.10和firebug进行调试 所以,这是我的代码: responseXML 始终为null,我已经尝试了来自不同域的多个URL。我也异步地尝试过,结果是一样的。该 responseText的 总是正确返回,与它没有任何问题。 我的目标是获取 responseXML.documentElement 。 谢谢你的帮助。 编辑----------- 此javas