Я хочу использовать S3 в качестве службы хранения данных для почтовой системы.
Идея состоит в том, чтобы позволить пользователям загружать файлы, которые служат вложениями к их электронным письмам, которые затем доступны для загрузки из веб-службы по ссылке на файл, размещенный на S3.
Проблемы, с которыми я сталкиваюсь:
Когда пользователи выбирают свои имена файлов, будут возникать конфликты, поэтому файлы на S3 должны иметь уникально сгенерированные имена или храниться в отдельных папках, могут ли пользователи загружать файлы с исходным именем файла, все еще используя какой-либо API или конфигурацию?
(пример: пользователь загружает файл dog.gif, хранящийся в корзине как A3f23_dog.gif, ссылка для скачивания возвращает файл как dog.gif, возможно, с использованием заголовков HTTP)
Влияет ли количество файлов / папок в одной корзине (в корне) на производительность? Или мне нужно распределить файлы по папкам и т. Д.
Могу ли я сделать файлы общедоступными с помощью URL-адресов, но НЕ разрешать перечисление файлов в корзине? (например, список файлов)
Большое спасибо, надеюсь, это имеет смысл.
Недавно я разработал аналогичную систему для хранения отчетов - вот что, как мы обнаружили, работает хорошо:
<user-id>/<year>/<month>/<day>/<message-id>/<user-defined-filename>
. Главный пункт пункта (1) - убедиться, что у вас нет конфликтов между пользователями - вы можете реструктурировать иерархию, как вам нравится, но ключевым моментом является наличие уникальных идентификаторов отдельно от ключевой структуры (в данном случае user-id и message-id), сохраняя исходное имя файла в качестве последней части структуры; последняя часть структуры - это то, что большинство браузеров используют в качестве имени загруженного файла.
Обратите внимание, что я включил дату как часть структуры - если у вас будет много объектов, вам нужно разделить их на виртуальные «папки» в пространстве ключей S3, чтобы вам не приходилось ждать вечно каждый раз, когда вам нужно искать файлы вручную.
Пункт (2) предоставляет доступ к файлам только получателям сообщения. Только владелец корзины (вы) сможет перечислять файлы (если вы явно не предоставите другие разрешения), но любой, у кого есть ссылка на файл, может получить к нему доступ.
Если вы хотите добавить больше контроля над ссылками, создайте ссылки, которые направляют пользователя через ваше приложение, а затем, если ваше приложение решает, что пользователь действительно авторизован, создайте предварительно подписанный URL-адрес и передайте его пользователю. (Таким образом, вы можете раздавать предварительно подписанные URL-адреса с ограниченным сроком действия, чтобы вы не просто предоставляли полный и постоянный доступ по ссылке.)