Spring upload file problems

2019-04-05 12:37发布

问题:

I need to upload file from browser to server. I use spring 3.2 as my web framework.

So i configured my app like this.

1 - I got web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>racoonsoft.chaos.settings</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>admin/library</welcome-file>
    </welcome-file-list>

</web-app>

2 - MainConfig class

@Configuration
@Import({WebConfig.class })
public class MainConfig {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public static ScheduledAnnotationBeanPostProcessor scheduledAnnotationBeanPostProcessor() {
        return new ScheduledAnnotationBeanPostProcessor();
    }

    @Bean
    public static StandardServletMultipartResolver multipartResolver() {
        StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();
        return resolver;
    }
}

3 - Controller to handle multipart uploads

@Controller
@MultipartConfig(fileSizeThreshold=1024*1024*2, // 2MB
        maxFileSize=1024*1024*10,      // 10MB
        maxRequestSize=1024*1024*50)
public class FileUpload
{
    public static final int UPLOAD_RESULT_OK = 100000;
    @Autowired
    BookDao book_dao;

    @RequestMapping(value = "/admin/library/upload_file", method = RequestMethod.POST)
    public String saveFiles(@RequestParam("file-file") MultipartFile file) throws IOException
    {
        if (!file.isEmpty())
        {
            byte[] bytes = file.getBytes();
            return "redirect:caps/total_fail";
        }
        else
        {
            return "redirect:caps/total_fail";
        }
    }
}

4 - jsp where i placed my form to submit files

...<form method="post" action="/admin/library/upload_file" enctype="multipart/form-data">
                <input type="text" name="name"/>
                <input type="file" name="file-file"/>
                <input type="submit"/>
            </form>...

When i submit my form i got an Exception

org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'file-file' is not present
    org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:202)

I got no idea why. When i remove @RequestParam annotaion i got my method invoked but file parameter = null. What is my problem?

回答1:

I fixed this problem by adding the following to my spring config file:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

(The error I was getting was "org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'myFile' is not present



回答2:

i can do it with

@Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {

        MultipartConfigElement multipartConfigElement = new MultipartConfigElement("/",100000, 200000, 50000);

        registration.setMultipartConfig(multipartConfigElement);

    }


回答3:

@user64141 is right but if using Java config instead of xml, try

@Bean
public MultipartResolver multipartResolver() {
    return new CommonsMultipartResolver();
}


回答4:

You also need the MultipartFilter configured for your webapp. According to its Javadoc, it resolves multipart requests using the MultipartResolver (but you have that one configured already). You'll need to map it to (part of) the request path for Controller that handles the file uploads.

First, add the MultipartFilter to your web.xml:

<filter>
    <filter-name>multipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>

Next, map the filter to (a part of) the URL that needs to accept file uploads:

<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <url-pattern>/admin/library/upload_file</url-pattern>
</filter-mapping>