0

ここでの提案を使用しましたhttp://www.web2pyslices.com/slice/show/1387/upload-image-and-make-a-thumbnail 画像のサムネイルを作成します。サムネイルを取得しましたが、表示できません。

以下は私の関数です: 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() 関数とビューで何か問題があります。助けてくれてありがとう!

4

1 に答える 1

1

FORMまず、あなたは と を混同しているように見えますSQLFORM。前者は (データベース テーブルに接続されていない) カスタム フォームを作成するためのもので、後者はデータベース テーブルに基づいてフォームを作成するためのものです (したがって、自動的に挿入を処理します)。DAL Table オブジェクトをコードの as に渡すことはできませんFORM。これは、Table オブジェクトをその文字列名にシリアル化するだけであり、HTML フォーム DOM に含まれても効果はありません。さらに、この場合、form.vars.id単純にNone(FORMはデータベースの挿入を行わないため、レコード ID を生成しません) になります。

また、ファイルを に直接保存するよりも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を参照してください。

于 2015-06-27T19:21:16.333 に答える