Ошибка Spingboot CORS только для Multipart POST - PullRequest
0 голосов
/ 20 декабря 2018

Здравствуйте, у меня возникла специфическая проблема

Я включил CORS на моем сервере Springboot API со следующей конфигурацией

@Bean
CorsConfigurationSource corsConfigurationSource() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", new CorsConfiguration().applyPermitDefaultValues());
    return source;
}

Все мои запросы POST работают, кроме API для загрузки изображений.Он реализован как

@PostMapping(value = "/profiles/{id}/image")
@ResponseStatus(value = HttpStatus.CREATED)
public void uploadProfileImage(@PathVariable Long id, @RequestPart MultipartFile file) {
    this.userService.uploadProfileImage(id, file);
}

. В браузере я вижу, что ОПЦИЯ для этого запроса выполнена успешно, но фактический POST выполняется, но висит, и консоль отображает эту ошибку.

Options call on console

Ошибка

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:10000/users/profiles/1/image. (Reason: CORS request did not succeed).[Learn More]

API работает правильно при использовании из PostMan, поэтому я думаю, что проблема связана с конфигурацией CORS, а не с реальной логикой API

Любые указатели?Попытка добавить @CrossOrigin к контроллеру и конкретному API безуспешно.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я нашел проблему.Я использую угловой 7 и угловой http компонент.Пришлось изменить мой метод сообщения с

uploadImageFile(file: File, id: number) {
        const formData: FormData = new FormData();
        formData.append('file', file, file.name);
        return this.http.post(`${environment.apiEndpoint}/users/profiles/${id}/image`, formData);
    }

на

uploadImageFile(file: File, id: number) {
        const formData: FormData = new FormData();
        formData.append('file', file, file.name);
        return this.http.post(`${environment.apiEndpoint}/users/profiles/${id}/image`, formData, {
            // This is required to manage post multipart updates
            headers: {}
        });
    }
0 голосов
/ 20 декабря 2018

Добавьте этот компонент в вашу конфигурацию для поддержки CORS:

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("*"));
    configuration.setAllowCredentials(true);
    configuration.setAllowedHeaders(Arrays.asList("Access- Control-Allow-Headers","Access-Control-Allow-Origin","Access-Control-Request-Method", "Access-Control-Request-Headers","Origin","Cache-Control", "Content-Type", "Authorization"));
    configuration.setAllowedMethods(Arrays.asList("DELETE", "GET", "POST", "PATCH", "PUT"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...