Лучший подход для загрузки нескольких файлов в Spring Boot - PullRequest
2 голосов
/ 09 июля 2019

Я работаю в проекте Spring Boot, где у меня есть две сущности.

Клиентская сущность :

@Entity
public class Client {

// mapping annotation ...
private Long id;

// mapping annotation ...
private String firstName;

// mapping annotation ...
private String lastName;

// mapping annotation ...
private Set<Document> listDocument;


....

}

Сущность документа:

   @Entity
    public class Document{

    // mapping annotation ...
    private Long id;

    // mapping annotation ...
    private String name;

    // mapping annotation ...
    private int size;

    // mapping annotation ...
    private Client client;


    ....

    }

В моем приложении есть форма, в которой я задаю всю информацию о клиентах.Кроме того, у меня есть входной файл, в который я должен загрузить несколько документов. Поэтому, когда я нажимаю кнопку «Отправить», мне необходимо сохранить информацию о клиенте в базе данных вместе со всей информацией (имя документа, размер ..) о документах (с клиентом).Id) должен быть сохранен в базе данных, а затем файлы для загрузки на сервер.

Я использую Spring Boot с Angular, я не прошу код, но я просто хочузнать, какой будет наилучший подход для достижения этого в соответствии с лучшими практиками.

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

У меня также был похожий вариант использования.Мы сделали это с помощью метода архивирования файлов (require less storage, fast for small documents).Когда Клиент загружает документы, мы создаем новый Zip-файл и называем его уникальным образом.( без изменения имен оригинальных документов ).Например, вы можете дать уникальное имя с clientID + uploadTime.

Теперь хранить можно несколькими способами (для быстрого поиска документов)

  • Создать только один каталог (не идеальный способ)
  • Создать каталоги согласно ClientId
  • Создание каталогов в соответствии с UploadTime (DayWise, MonthWise)

Если все документы успешно загружены, то вы можете сохранить информацию одокументы в таблице.Обратите внимание, что сохранение пути документа может создать проблему, если путь изменится в будущем, поэтому сохраняйте только имя документа.Так как здесь вам нужно хранить детали каждого документа, вы можете создать две таблицы.One table with id(pk), client Id, zip filename another with id(fk), document name, size etc.

вы можете настроить максимальный размер файла, максимальный размер запроса, как показано ниже в application properties

MULTIPART (MultipartProperties)
    spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.
    spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.
    spring.servlet.multipart.location= # Intermediate location of uploaded files.
    spring.servlet.multipart.max-file-size=1MB # Max file size.
    spring.servlet.multipart.max-request-size=10MB # Max request size.
    spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.  
0 голосов
/ 09 июля 2019

Я не понял сути вопроса.

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

Предлагаю хранить следующую дополнительную информацию о загружаемых файлах:

  1. Дата и время загрузки файла
  2. Идентификатор запроса. Чтобы знать, что несколько файлов были загружены в одном запросе. Вы можете использовать время в миллис System.currentTimeMillis() или UUID UUID.randomUUID().toString()

Также, если система содержит много файлов - я рекомендую хранить файлы в отдельных каталогах, чтобы ускорить поиск. Вы можете хранить в каталогах по времени создания (например, каждый месяц новый каталог) или по идентификатору пользователя. Все зависит от критериев поиска файлов.

Я бы рекомендовал вам переименовывать файлы перед сохранением с любым уникальным идентификатором (например, UUID), чтобы избежать коллизий. Конечно, вы должны хранить оригинальные и переименованные имена файлов в базе данных. Также этот подход не позволит пользователю подобрать имя файла, если будет открыт каталог с файлами. Я имею в виду, что пользователи не могут угадать чужие файлы https://file-storage/user-john-dou/logo.jpg

Если вы работаете с изображениями, вы можете подумать об изменении размера перед сохранением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...