Правильное место для сохранения изображений (весна / эластик)

Я пытаюсь реализовать функциональность профиля пользователя, сначала я нашел пример загрузки фотографий, и он сохраняет его в папку приложения, например home\jelastic\app\my_folder, но есть 2 проблемы:

1) если мне нужно обновить приложение и загрузить новую сборку, я хочу сохранить эти изображения, но я потеряю эти данные

2) я не могу читать фотографии (входной поток по какой-то причине нулевой)

public @ResponseBody byte[] getImageWithMediaType() throws IOException {
        InputStream in = getClass()
                .getResourceAsStream(storageService.getPath() + "/1544717586066.jpeg");
        return ByteStreams.toByteArray(in);
    }

Итак, как правильно сохранять / читать фотографии на jelastic?

Я бы сохранил его в базе данных как blob

stacktraceyo 24.12.2018 19:25

Спасибо. я думал об этом, но, похоже, лучший способ - использовать хранилище файлов: stackoverflow.com/questions/3748/…

Siarhei 24.12.2018 19:31

Хорошо, следуйте этому совету - и используйте базу данных для хранения метаданных для изображений.

stacktraceyo 24.12.2018 19:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
182
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему бы тебе не взглянуть на Весенний контент. Это сделано для того, чтобы делать именно то, что вы пытаетесь сделать.

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

pom.xml

   <!-- Java API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-fs-boot-starter</artifactId>
      <version>0.4.0</version>
   </dependency>

   <!-- REST API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-rest-boot-starter</artifactId>
      <version>0.4.0</version>
   </dependency>

FilesystemConfiguration.java

@Configuration
public class FilesystemConfiguration {

    @Bean
    File filesystemRoot() {
        try {
            return new File("/path/to/your/user/profile/image/store");
        } catch (IOException ioe) {}
        return null;
    }

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

User.java

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

   ...other existing fields...

   @ContentId
   private String contentId;

   @ContentLength
   private long contentLength = 0L;

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

   ...
}

UserContentStore.java

@StoreRestResource(path = "userProfileImages")
public interface UserContentStore extends ContentStore<User, String> {
}

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

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

curl -X POST /userProfileImages/{userId} -F "file=@/path/to/image.jpg"

сохранит изображение в файловой системе и свяжет его с пользовательской сущностью с идентификатором userId.

curl /userProfileImages/{userId}

получит его снова и так далее ... на самом деле поддерживает полный CRUD и потоковое видео.

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

Другие вопросы по теме