Web2py: как отображать загруженное изображение, которое хранится в базе данных?

Есть ли способ отображения изображений из таблицы базы данных через web2py?

Пример:

Модель:

db.define_table=('images',Field('picture', 'upload' ))

Контроллер:

def somefunction(): to get the image.

Как именно я должен "читать" изображение из базы данных?

Вид:

<img src="{{somefunction}}" />

Ответ 1

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

db.define_table('images',
    Field('picture', 'upload', uploadfield='picture_file')
    Field('picture_file', 'blob'))

Сохраняя изображения в файловой системе или в базе данных, вы можете использовать тот же метод для их извлечения. Приложение "приветствия" для строительных лесов включает в себя следующее download() действие в контроллере default.py:

def download():
    return response.download(request, db)

Чтобы получить изображение, просто выполните что-то вроде:

<img src="{{=URL('default', 'download', args=picture_name)}}" />

где picture_name - это значение, хранящееся в поле "picture" таблицы "images" для конкретного изображения, которое вы хотите получить.

Подробнее см. здесь и здесь.

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

Ответ 2

В качестве альтернативы, если вы используете стандартный способ загрузки изображений в формате web2py по умолчанию, вы можете использовать:

В моделях:

db.define_table('images',Field('picture','upload'))

В контроллерах:

def somefunction():
    pic = db(db.images).select().first().picture   #select first picture
    return dict(pic=pic)

И в представлении default/somefunction.html:

{{extend 'layout.html'}}
<img  src="{{=URL( 'download', args=pic)}}" />

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