Назад | Перейти на главную страницу

Использование amazon S3 в качестве хранилища вложений в системе веб-почты

Я хочу использовать S3 в качестве службы хранения данных для почтовой системы.
Идея состоит в том, чтобы позволить пользователям загружать файлы, которые служат вложениями к их электронным письмам, которые затем доступны для загрузки из веб-службы по ссылке на файл, размещенный на S3.

Проблемы, с которыми я сталкиваюсь:

  1. Когда пользователи выбирают свои имена файлов, будут возникать конфликты, поэтому файлы на S3 должны иметь уникально сгенерированные имена или храниться в отдельных папках, могут ли пользователи загружать файлы с исходным именем файла, все еще используя какой-либо API или конфигурацию?
    (пример: пользователь загружает файл dog.gif, хранящийся в корзине как A3f23_dog.gif, ссылка для скачивания возвращает файл как dog.gif, возможно, с использованием заголовков HTTP)

  2. Влияет ли количество файлов / папок в одной корзине (в корне) на производительность? Или мне нужно распределить файлы по папкам и т. Д.

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

Большое спасибо, надеюсь, это имеет смысл.

Недавно я разработал аналогичную систему для хранения отчетов - вот что, как мы обнаружили, работает хорошо:

  1. Используйте '/' в ваших ключах, чтобы создать структурированную иерархию. В вашем случае я бы сделал что-то вроде: <user-id>/<year>/<month>/<day>/<message-id>/<user-defined-filename>.
  2. Использовать предварительно подписанный URL чтобы предоставить доступ к файлу в S3 только пользователям, имеющим доступ к доставленной электронной почте.

Главный пункт пункта (1) - убедиться, что у вас нет конфликтов между пользователями - вы можете реструктурировать иерархию, как вам нравится, но ключевым моментом является наличие уникальных идентификаторов отдельно от ключевой структуры (в данном случае user-id и message-id), сохраняя исходное имя файла в качестве последней части структуры; последняя часть структуры - это то, что большинство браузеров используют в качестве имени загруженного файла.

Обратите внимание, что я включил дату как часть структуры - если у вас будет много объектов, вам нужно разделить их на виртуальные «папки» в пространстве ключей S3, чтобы вам не приходилось ждать вечно каждый раз, когда вам нужно искать файлы вручную.

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

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