2015-06-26 4 views
0

Я использовал предложение здесь http://www.web2pyslices.com/slice/show/1387/upload-image-and-make-a-thumbnail , чтобы сделать эскиз изображения. У меня есть миниатюра, но я не могу ее отобразить.Image Thumbnail in Web2py: Невозможно отобразить миниатюру

Ниже приведены мои функции: db.py:

db.define_table('uploads', Field('dataset', 'reference dataset'), 

Field('filename', represent = lambda x, row: "None" if x == None else [:45]), 

Field('image', 'upload', uploadseparate=True, requires=IS_NOT_EMPTY() and IS_IMAGE(extensions=('jpeg', 'png','jpg','tif'))), 
Field('thumb', 'upload', uploadseparate=True, requires=IS_NOT_EMPTY() and IS_IMAGE(extensions=('jpeg', 'png', 'jpg', 'tif')))) 

default.py:

def makeThumbnail(dbtable,ImageID,size=(150,150)): 
    try: 
     thisImage=db(dbtable.id==ImageID).select()[0] 
     import os, uuid 
     from PIL import Image 
    except: return 
    im=Image.open(request.folder + 'uploads/' + thisImage.image) 
    im.thumbnail(size,Image.ANTIALIAS) 
    thumbName='uploads.thumb.%s.jpg' % (uuid.uuid4()) 
    im.save(request.folder + 'uploads/' + thumbName,'jpeg') 
    thisImage.update_record(thumb=thumbName) 
    return 


def insertImage(): 
    response.menu = [ 
    (T('Home'),False,URL('default','experimenter')), 
    (T('Manage Data Set'),False,URL('default','MDS')), 
    (T('Manage Experiment'),False,URL('default','ME')), 
    (T('Manage Workflow Element'),False,URL('default','MWE'))]   
    dbtable = db.uploads 
    record = None 
    record = db(db.dataset.id == request.args[0],ignore_common_filters=True).select().first() 
    form = FORM(dbtable, INPUT(_name='up_files', _type='file', 
    _multiple=True, requires=IS_NOT_EMPTY()),INPUT(_type='submit')) 
    # The multiple param lets us choose multiple files. 
    if form.process().accepted: 
    #onvalidation checks the uploaded files to make sure they are only txt,   config, or log. 
    makeThumbnail(dbtable,form.vars.id,(300,300)) 
    response.flash = 'files uploaded' 
    files = request.vars['up_files'] 
     if not isinstance(files, list): 
    #convert files to a list if they are not one already. 
     files = [files] 
     for file in files:   
     db.uploads.insert(dataset=record.id, filename=file.filename, image=db.uploads.image.store(file, file.filename)) 

     #store is a FIELD method that let's you save a file to disk. you can choose the directory if you want using the 'path' param. 
    else: 
     response.flash = 'Choose the Files you would like to upload' 
    return dict(form=form, record=record) 

И тогда вид:

{{extend 'layout.html'}} 
<h4>Manage Image of dataset: {{=record.name}}</h4> 

{{if images:}} 
<div style="overflow: auto;" width="80%"> 
<table> 
<tr> <th> Image </th> </tr> 
{{ 
    for image in images: 
    =TR(TD(image.filename), IMG(_src=URL('default', 'download', args=image.thumb)), A(str(T('View')),_href=URL("show", args=[image.id,rowId])), A(str(T('Delete')),_href=URL('deleteImage',args=image.id)))}} 
    {{pass}} 
</table> 

</div> 
{{pass}} 

Примечание: Я пытаюсь для отображения эскизов для каждого изображения в списке изображений (см. представление). Я не получаю миниатюру, но небольшие мелкие вопросительные знаки на ее месте. PS: Я не могу загрузить изображение. Я хочу изображения вместо вопросительного знака. Я делаю что-то неправильно в функции insertImage(), а также в представлении. Спасибо, что за помощь!

ответ

1

Во-первых, вы, кажется, объединяетесь FORM и SQLFORM. Первая предназначена для создания пользовательских форм (не связанных с любыми таблицами базы данных), а последняя предназначена для построения формы на основе таблицы базы данных (и, следовательно, автоматической обработки вставок). Вы не можете передать объект таблицы DAL в FORM, как в вашем коде, - это просто сериализует объект Table на его имя строки, которое будет включено в HTML-форму DOM без эффекта. Кроме того, в этом случае form.vars.id будет просто None (FORM не генерирует идентификаторы записи, так как он не вставляет никаких вставок базы данных).

Кроме того, чтобы сохранить файл в makeThumbnail, лучшим вариантом было бы сохранить изображение в объекте StringIO, а затем передать этот объект db.uploads.thumbnail.store() (как и для сохранения исходного изображения). В этом случае метод поля миниатюр .store() будет обрабатывать именование и сохранение файлов автоматически.

from cStringIO import StringIO 
tmp = StringIO() 
im.save(tmp, 'jpeg') 
tmp.seek(0) 
thisImage.update_record(thumb=db.uploads.thumb.store(tmp, filename='thumbnail.jpg')) 

Для получения дополнительной информации см. http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer.

 Смежные вопросы

  • Нет связанных вопросов^_^