Как обновить изображение с помощью URL изображения - PullRequest
0 голосов
/ 21 января 2020

У меня есть метод, который принимает файл многокомпонентного изображения, если я хочу обновить то же изображение, то, очевидно, я должен принять URL изображения в качестве входного, но я не могу принять вход в качестве URL, так как он принимает формат файла мой метод:

           MediaType.APPLICATION_OCTET_STREAM_VALUE}, produces = MediaType.APPLICATION_JSON_VALUE)
   public ResponseEntity<ApiResponse> updatePersonalDataForUser(
           @RequestHeader("accessToken") @NotEmpty(message = "accessToken is mandatory") String bearer,
           @RequestHeader("mappingId") @NotEmpty(message = "mappingId is mandatory") String mappingId,
           @RequestPart("personalInfoObj") String personalInfoObj,
           @RequestPart(value = "profileImage") MultipartFile profileImage)
           throws IOException {

       jobPostController.userRoleAuthorization(mappingId);
       userController.oAuthByRedisAccessToken(bearer, mappingId);

       ObjectMapper objectMapper = new ObjectMapper();
       PersonalInfoResponse personalInfoConv = objectMapper.readValue(personalInfoObj, PersonalInfoResponse.class);
       return userController.updatePersonalData(mappingId, personalInfoConv, profileImage, Contants.UserRoleName);
   }```

1 Ответ

0 голосов
/ 21 января 2020

Вам следует взглянуть на проект сообщества Spring под названием Spring Content .

Этот проект позволяет легко создавать содержательные приложения и сервисы. Он имеет ту же модель программирования, что и Spring Data. Это означает, что он может предоставлять реализации для хранилища файлов и контроллеров REST поверх этого хранилища файлов, поэтому вам не нужно заботиться о создании их самостоятельно. Spring Content - это данные (или неструктурированные данные), а Spring Data - структурированные данные

Это может выглядеть примерно так: -

pom. xml (для Spring Web MVC. Spring Boot также поддерживается)

   <!-- Spring Web MVC dependencies -->
   ...

   <!-- Java API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-fs</artifactId>
      <version>1.0.0.M5</version>
   </dependency>

   <!-- REST API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-rest</artifactId>
      <version>1.0.0.M5</version>
   </dependency>

StoreConfig. java

@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {

    @Bean
    File filesystemRoot() {
        try {
            return new File("/path/to/your/uploaded/files");
        } catch (IOException ioe) {}
        return null;
    }

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() {
        return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }

}

ImageStore. java

@StoreRestResource(path="images")
public interface ImageStore extends Store<String> {
}

Это все, что вам нужно сделать, чтобы получить конечные точки REST, которые позволят вам хранить и извлекать файлы. Как уже упоминалось, как это на самом деле работает, очень похоже на Spring Data. Когда ваше приложение запустится, Spring Content увидит зависимость spring-content-fs, знайте, что вы хотите сохранить контент в вашей файловой системе, и внедрите реализацию интерфейса ImageStore в файловой системе в контекст приложения. Он также увидит spring-content-rest и введет контроллер (т. Е. Конечные точки REST), который взаимодействует с интерфейсом ImageStore. Следовательно, вам не нужно ничего делать самостоятельно.

Так, например:

curl -X POST /images/myimage.jpg -F "file=@/path/to/myimage.jpg"

сохранит изображение в файловой системе в /path/to/your/uploaded/files/myimage.jpg

И:

curl /images/myimage.jpg

получит его снова и так далее ... эти конечные точки поддерживают полный CRUD, а конечные точки GET & PUT также поддерживают потоковую передачу видео (или запросы диапазона байтов).

You также может решить сохранить содержимое в другом месте, например, в базе данных с вашими сущностями или в S3, поменяв местами зависимость spring-content-fs для соответствующего модуля Spring Content Storage. Примеры для каждого типа хранилища: здесь .

Кроме того, если это полезно, часто контент связан с объектами данных Spring. Таким образом, интерфейс ImageStore также может реализовывать ContentStore, например:

> FileStore.java

    @StoreRestResource(path="images")
    public interface ImageStore extends ContentStore<PersonalInfo, String> {
    }

, и добавлять поля, аннотированные Spring Content, в ваши объекты Spring Data, например:

> PersonalInfo.java

    @Entity
    public class PersonalInfo {
       @Id
       @GeneratedValue
       private long id;

       ...other existing fields...

       @ContentId
       private String contentId;

       @ContentLength
       private long contentLength = 0L;

       @MimeType
       private String mimeType = "text/plain";

       ...
    }

При таком подходе конечные точки REST изменяются, так как контент теперь адресуется через URL-адрес данных Spring. Итак:

POST /personalInfos/{personalInfoId} -F "image=@/some/path/to/myimage.jpg"

загрузит myimage.jpg в /path/to/your/uploaded/files/myimage.jpg. Как и раньше, но он также обновит поля в сущности PersonalInfo с идентификатором personalInfoId.

GET /personalInfos/{personalInfoId}

получит его снова.

HTH

...