Искал аналогичные проблемы в гугле. Нашёл 2 варианта решения. Но 1 меня не устраивает, т.к. файл сохраняется 2 раза, затем переоткрывается и т.п.
http://spindrop.us/2009/02/21/resizing-image-on-upload-in-django/
Здесь - общая идея - обработать с помощью PIL StringIO обьект, затем сохранить его, затем открыть open, и передать FIle(opened-descriptor)
2-я - Попросту не работает, но идея красива. То же самое, но сохраняем в StringIO обьект, затем на его основании делаем InMemoryUploadedFile.
http://softwaremaniacs.org/forum/django/10881/
и в первой и во второй версии всё делается в _clean методах соответствующих полей.
Вся штука в том, что затем сей обьект, который был получен в _clean-е должен затем использоваться в save формы в виде
table_name.photo.save(string_filename, File_object)
А у нас - InMemoryUploadedFile…..
Расковырял по сорцам и с помощью WingIDE. Пока сделал следующий “костыль” на основании того, что в File(file) есть file.mode, а в InMemoryUploadedFile - его лишь нету…
Сделал класс
class InMemoryUploadedFileWrite(InMemoryUploadedFile):
mode = "w"
_clean(поля):
memfile = InMemoryUploadedFileWrite(magic, image.field_name, filename, image.content_type, magic.len, image.charset)
upl = File(memfile)
return {'filename': filename, 'content': upl}
table_name.photo.save(filename, upl)
Вопрос. Может кто делал уже? Да ведь задача-то тривиальная - просто отресайзить(можно и без ресайза) и сохранить картинку зааплоаденную…..
Зааплоаденная картинка(из формы) является
def __clean_upload_img(self, name):
image = self.cleaned_data[name]
Но чтоб её потом сохранить в форме - надо сохранять обьект File. Т.е. с этим сталкивался очень много кто….
На форуме искал - готовых ответов - нет.
Спасибо