Spring MVC Rest Multipart Upload funktioniert nicht!

Dieses Thema Spring MVC Rest Multipart Upload funktioniert nicht! im Forum "Application Tier" wurde erstellt von stargate2k, 14. März 2014.

Thema: Spring MVC Rest Multipart Upload funktioniert nicht! Hi, ich versuche gerade verzweifelt den multipart upload einzurichten. Ich verwende Spring MVC als Server Backend...

  1. 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:

    Code (Java):
    @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:

    Code (Text):
    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:

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

           @Bean
    public MultipartResolver multipartResolver(){

            return new StandardServletMultipartResolver();
        }

    }
    und ApplicationCOnfig:

    Code (Text):
    @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:

    PHP:
    <!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
     
    Zuletzt bearbeitet: 14. März 2014
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Flown
    Flown Mitarbeiter
    Also da ich auch gerade mit Spring MVC arbeite kann ich dir sagen, dass der Fehler hier liegt:

    Code (Java):

    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.