簡體   English   中英

Angular2和Spring中“不存在必需的MultipartFile參數'uploadfile'”

[英]“Required MultipartFile parameter 'uploadfile' is not present” with Angular2 and Spring

我有一個帶有angular2(2.1.0)的單頁應用程序和一個帶有Spring(微服務)的REST API。 微服務是通過jHipster(2.3)構建的。 角度服務和微服務之間的通信正常。

現在,我想從角度上傳文件到春天。

我已經在我的pom.xml文件中包含了必要的庫作為依賴項:

<dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.2</version>
</dependency>

在春季,我將multipartfilter配置為一個bean。

見下文:

 @Configuration
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
 public class MicroserviceSecurityConfiguration extends WebSecurityConfigurerAdapter {

  ...

  @Override
  protected void configure(HttpSecurity http) throws Exception {
      //http.addFilterBefore(multipartFilter(), CsrfFilter.class);
      System.out.println("Loading configure");
      http
      .addFilterBefore(multipartFilter(), CsrfFilter.class)
          .csrf()
          .disable()
          .headers()
          .frameOptions()
          .disable()
      .and()
          .sessionManagement()
          .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
      .and()
          .authorizeRequests()
          .antMatchers("/api/**").authenticated()
          .antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN)
          .antMatchers("/swagger-resources/configuration/ui").permitAll()
      .and()
          .apply(securityConfigurerAdapter());

  }

 @Bean(name = "commonsMultipartResolver")
  public CommonsMultipartResolver commonsMultipartResolver() {
      final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
      commonsMultipartResolver.setMaxUploadSize(-1);

      return commonsMultipartResolver;
  }

 @Bean
  @Order(0)
  public MultipartFilter multipartFilter() {
          MultipartFilter multipartFilter = new MultipartFilter();
          multipartFilter.setMultipartResolverBeanName("commonsMultipartResolver");
          return multipartFilter;
  }

我的REST-API方法:

/**
 * Upload single file using Spring Controller
 */
@RequestMapping(value = "/uploadFile",
        method = RequestMethod.POST)
@Timed
public String uploadFileHandler(@RequestHeader("Authorization") String token, 
        @RequestParam("uploadfile") MultipartFile file) {
    System.out.println("bin in der Methode: uploadFileHandler");
    if (!file.isEmpty()) {
        // do something
    }
}

在Angular中,我使用ng2-file-upload模塊上傳文件。

HTML:

<input type="file" ng2FileSelect (fileOver)="fileOverBase($event)" [uploader]="uploader" multiple  name="uploadfile"/><br/>

通過xhr-object的打字稿:

uploadFile(file: File): Promise<any> {

    return new Promise((resolve, reject) => {

        let xhr: XMLHttpRequest = new XMLHttpRequest();
        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    resolve(JSON.parse(xhr.response));
                } else {
                    reject(xhr.response);
                }
            }
        };

        xhr.open('POST', this.projectAPI + '/uploadFile', true);
        // If I set the content-type
        // I don't get an answer in spring
        //xhr.setRequestHeader('Content-Type', 'multipart/form-data');
        xhr.setRequestHeader('Authorization', 'Bearer ' + localStorage.getItem('id_token'));

        let formData = new FormData();
        console.log(file.name);
        formData.append("uploadfile", file, file.name);
        xhr.send(formData);
    }).catch(this.handleError);
}

當我上傳文件時,收到錯誤消息:

[org.springframework.web.bind.MissingServletRequestParameterException: Required MultipartFile parameter 'uploadfile' is not present]
... <500 Internal Server Error

怎么了? 我忘記了什么嗎? 非常感謝您的幫助。

我找到了解決方案。

我在“ WebConfigurer”類中轉移了配置。

@Bean(name = "commonsMultipartResolver")
public MultipartResolver multipartResolver() {
    log.info("Loading the multipart resolver");
    return new StandardServletMultipartResolver();
}


@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();

    factory.setMaxFileSize("10MB");
    factory.setMaxRequestSize("10MB");

    return factory.createMultipartConfig();
}

在角度上,我使用了Eswar的解決方案。

現在工作正常。 感謝名單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM