Загрузить изображение в администратор Django, обрезать и масштабировать и отправить его в Amazon S3, не сохраняя файл локально? - PullRequest
2 голосов
/ 28 декабря 2011

Я хочу разрешить пользователям загружать изображение через администратора Django, обрезать и масштабировать это изображение в памяти (возможно, с помощью PIL) и сохранять его в Amazon S3 без сохранения изображения в локальной файловой системе.Я сохраню путь изображения в моей базе данных, но это единственный аспект изображения, который сохраняется локально.Я хотел бы интегрировать этот специальный виджет загрузки изображений в форму обычной модели на странице редактирования администратора.

Этот вопрос аналогичен, за исключением того, что решение не использует интерфейс администратора.

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

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

См. https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#changing-upload-handler-behavior

Если изображения меньше определенного размера, они уже будут храниться только в памяти, поэтому вы можете настроить параметр FILE_UPLOAD_MAX_MEMORY_SIZE в соответствии со своими потребностями. Кроме того, вам необходимо убедиться, что у вас нет доступа к полю .path этих загруженных изображений, поскольку это приведет к их записи в файл. Вместо этого используйте (например) метод .read(). Я не проверял это, но я верю, что это будет работать:

image = PIL.Image(request.FILES['my_file'])
0 голосов
/ 29 декабря 2011

Ну, если вы не хотите касаться административной части Django, вы можете определить масштабирование в методе моделей save (). Но при использовании ImageField в Django. Джанго может сделать для вас экономию. Имеются варианты высоты и ширины.

https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield

Для загрузки на S3 я действительно рекомендую использовать бэкэнды django-хранилищ из:

https://bitbucket.org/david/django-storages/src (предпочтительно версия S3-boto)

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

...