# Spring MVC Rest Multipart Upload funktioniert nicht!



## stargate2k (14. Mrz 2014)

Hi,

ich versuche gerade verzweifelt den multipart upload einzurichten. Ich verwende Spring MVC als Server Backend  und habe dort einige rest services eingerichtet und als WebFrontend nutze ich Angularjs. Der Fehler hat im Moment nichts mit Angular zutun ich nutze zum testen erst einmal iene normale html seite mit einem Form-Element für den upload und ich nutze keine xml files nur java config.
Mein aktueller Aufbau sieht so aus:

Upload controller:


```
@Controller
@RequestMapping("Upload")
@MultipartConfig(fileSizeThreshold=1024*1024*10,    // 10 MB
maxFileSize=1024*1024*50,          // 50 MB
maxRequestSize=1024*1024*100)      // 100 MB
public class UploadController {

    @RequestMapping(value="/upload", method=RequestMethod.GET)
    public @ResponseBody String provideUploadInfo() {
        return "You can upload a file by posting to this same URL.";
    }

    @RequestMapping(value="/upload", method=RequestMethod.POST)
    public @ResponseBody String handleFileUpload(@RequestParam("name") String name, 
            @RequestParam("file") MultipartFile file){
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream = 
                        new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded")));
                stream.write(bytes);
                stream.close();
                return "You successfully uploaded " + name + " into " + name + "-uploaded !";
            } catch (Exception e) {
                return "You failed to upload " + name + " => " + e.getMessage();
            }
        } else {
            return "You failed to upload " + name + " because the file was empty.";
        }
    }

}
```

Webinitializer:


```
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{ PersistenceContext.class,AppConfig.class,SecurityConfig.class }; 
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/Spring/*" }; 
    }

    @Override
    protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");

        CorsFilter cf=new CorsFilter();
            MultipartFilter mpf=new MultipartFilter(); //MultipartFilter support
        return new Filter[] {characterEncodingFilter,cf,mpf};

    }




}
```

WebCOnfig:


```
@Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = { "controller" })
    public class WebConfig extends WebMvcConfigurerAdapter {

       @Bean
public MultipartResolver multipartResolver(){

        return new StandardServletMultipartResolver();
    }

}
```

und ApplicationCOnfig:


```
@Configuration
public class AppConfig {

    @Bean
    public Test getTest(){


        return new Test();
    }
}
```

Ich habe nun einfach auf nem selben lokalen Rechner eine html seite mit folgendem Inhalt erstellt:


```
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<form method="POST" enctype="multipart/form-data"
		action="http://localhost:8081/project/Spring/Upload/upload">
		File to upload: <input type="file" name="file"><br /> Name: <input
			type="text" name="name"><br /> <br /> <input type="submit"
			value="Upload"> Press here to upload the file!
	</form>

</body>
</html>
```

uploaden will ich damit csv files, wenn ich eines auswähle und einen namen vergebe  dann kommt folgende Fehlermeldung:

"HTTP Status 400- Required String parameter 'name' is not present" wenn ich name als nicht required setze dann kommt die selbe Fehlermeldung mit 'file'

weiß einer wo hier der Fehler liegt ? Habe ich den MultipartUpload falsch eingerichtet oder stimmt irgendwas anderes nicht? Da ich tomcat verwende bzw einen servlet 3 container brauche ich ja diese 2 jars nicht einbinden oder !?
     <!-- Apache Commons Upload -->
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
    </dependency>
    <!-- Apache Commons Upload -->
    <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
    </dependency>

Soweit ich weiß braucht man für den Multipart upload einen MultipartFIlter und den StandardServletMultipartResolver, habe ich diese 2 vll falsch eingebunden oder liegt das Problem wo anderst ?
mfg stargate


----------



## Flown (15. Mrz 2014)

Also da ich auch gerade mit Spring MVC arbeite kann ich dir sagen, dass der Fehler hier liegt:


```
public @ResponseBody String handleFileUpload(@RequestParam("name") String name,
            @RequestParam("file") MultipartFile file){
```

Du benötigst beim File einen @RequestBody und keinen @RequestParam, da das File übertragen werden soll und nicht der Name.


----------

