Обработка частных изображений S3 с контентом, созданным пользователем
Привет, ребята, мне нужна помощь.
В настоящее время я работаю над проектом, в котором мы позволяем нашим пользователям создавать, скажем, документы, где они могут создавать несколько записей для данной статьи.
В настоящее время проект состоит из тонкого интерфейса, серверной части Kotlin и хранилища s3.
В базе данных у меня есть таблица «paper» и таблица «paper_entries». В «paper_entries» есть столбец «content», который представляет собой поле, которое они могут редактировать во внешнем интерфейсе с помощью редактора контента «tiptap», и оно сохраняется в формате HTML.
HTML обрабатывается с помощью «jsoup» на серверной стороне перед помещением в БД. Все идет нормально.
На этом этапе я хотел бы позволить пользователям обрабатывать изображения. Поэтому я создал расширение для обработки загрузки с заранее назначенными URL-адресами, которые интерфейс запрашивает у серверной части, загружает изображение, обновляет контент с помощью тега и отправляет его на серверную часть.
- FE запросил URL-адрес загрузки на s3 из BE
- загружает изображение в s3
- FE отправляет обновленный контент в BE
*id = имя объекта на s3
Теперь начинается большая борьба.... Поскольку в документе может быть несколько записей (предположим, 10-100), и каждая запись может содержать X изображений, мне нужно сгенерировать подписанные URL-адреса для каждой записи. Для замены я использую регулярное выражение, чтобы найти целевой идентификатор, затем создаю подписанный URL-адрес и устанавливаю его как src. ()
Именно здесь я заметил значительное влияние на производительность при получении данных. От ~30мс до ~600мс. Замену делал в БЭ.
Из-за этого влияния на производительность я теперь попытался заменить данные на стороне клиента (браузера), что намного удобнее, поскольку пользователь на самом деле не видит большой задержки, поскольку контент находится немного дальше на странице.
Но из-за этой замены на стороне клиента мне приходится для каждого изображения вызывать серверную часть, чтобы получить подписанный URL-адрес. Это работает, но все равно кажется, что это ужасно.
Есть ли более приятные решения? Я много гуглил, чтобы найти похожие условия, но не смог.
Короче говоря, я попробовал:
- Заменить контент в BE
Довольно большое влияние на производительность: от ~30 мс до ~600 мс. (Может быть, я сделал что-то ужасно неправильно???) Я использовал регулярное выражение:/<img\W?(src=\".*\")?(id=\"([a-zA-Z0-9-]+)\"\Wwidth=\"\d+\"\W?height=\"\d+\")\W?>/gm
- Заменить контент в FE
Необходимо сделать вызов для каждого изображения, чтобы получить подписанный URL-адрес.
- Пытался создать подписанный URL-адрес во внешнем интерфейсе.
Пока что я здесь застрял, потому что существующие библиотеки, такие как AWS и minio, на самом деле не являются инструментами для использования в браузере.