Правильное место для сохранения изображений - PullRequest
0 голосов
/ 24 декабря 2018

Я стараюсь реализовать функциональность профиля пользователя, во-первых, я нашел пример для загрузки фотографий, и он сохраняет его в папке приложения, как 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?

Ответы [ 2 ]

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

Если вы повторно развернете весь контейнер , то для организации хранения файлов мультимедиа могут пригодиться следующие статьи: 5 способов хранения данных с контейнерами и Обзор контейнера хранения данных.Общая идея - создать том (локальный или удаленный).

Если вы повторно развертываете приложение через Диспетчер развертывания , просто сохраняйте файлы вне папки вашего приложения, например /home/jelastic/myfiles.Но, тем не менее, если вы собираетесь хранить много данных, для этого лучше использовать отдельный контейнер для хранения данных.

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

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

Если вы используете 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.Примеры для каждого типа хранилища: здесь .

...