Rails, Heroku, Paperclip и загрузка файлов на S3

Я работаю над приложением, которое позволит пользователям отправлять zip-файлы размером около 5 Мб, я думаю. Затем я возьму эти файлы вручную и поработаю с ними.

Я изучаю использование Paperclip, как предлагает heroku для этой задачи - полностью обходя heroku - и просто загружаю в Amazon S3.

Однако теперь, когда я возиться с этим, похоже, что пользовательская модель может иметь ОДНОЕ вложение, а не множественное. Есть ли лучшая альтернатива или, возможно, прямой способ просто загрузить на S3, зная мое имя, ключи и так далее?

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

4 ответа

Решение

Вы можете найти множество доступных руководств по настройке скрепки, работающей с несколькими вложениями.

Скрепка поддерживает неограниченное количество вложений.

Посмотрите на S3 POST API, который потребует некоторые параметры подписи, сгенерированные на вашем сервере, но позволит вам загружать непосредственно на S3. После успешной загрузки на S3 вы должны сделать отдельный запрос, чтобы уведомить ваш сервер heroku о наличии нового вложения и имени файла вложения. Обычно для этого требуется взломать параметр [attachment]_file_name, чтобы избежать ненужной загрузки файла скрепкой во второй раз.

В целом, я обнаружил, что у Paperclip есть некоторые серьезные недостатки в дизайне, а это означает, что он требует неудачного взлома, чтобы хорошо играть с файлами, которые не загружаются через плагин. Я должен был в значительной степени взломать вещь полностью. Для моего следующего проекта я буду искать альтернативу, которая более четко отделяет вложения от моделей и имеет более модульный механизм хранения.

Тем не менее, решение, которое я упомянул, прекрасно работает. Сложность состоит в том, чтобы явно установить поле [attachment]_file_name в модели, чтобы Paperclip подумал, что файл с оригинальным файлом уже был сохранен.

На популярной альтернативе скрепке есть CarrierWave. Когда несколько месяцев назад я просматривал вложения, это было очень рекомендовано.

Можно использовать S3 Post API, но это покажет ваш секретный ключ в формах, которые довольно уязвимы с точки зрения безопасности.

Вы должны использовать прямую загрузку в библиотеку s3 js, чтобы ваш секретный ключ оставался секретным.

Спасибо

Другие вопросы по тегам