3

私は繰り返し可能なフォームフィールドを持っています:

<div class="repeat">
    <input type="file" name="files[==row-count-placeholder==]" />
</div>

たとえば、(jQueryを使用して)結果は次のようになります

<div class="repeat">
    <input type="file" name="files[0]" />        
    <input type="file" name="files[1]" />  
    <input type="file" name="files[2]" />
    <!-- and so on -->
</div>

ユーザーがアップロードしたいファイルの数に応じて。フォーム メソッドはpostで、enctype はmultipart/form-dataです。

サーバーとしてcherrypyを使用し、官能的な検証ライブラリを使用して、アップロードしたファイルを保存したいと思います:

import voluptuous

def save_uploaded_file(file, path)
    #save file on server...

def validate_files(files):    
    for file in files:
        save_uploaded_file(file, cherrypy.request.config['static_dir'])

@cherrypy.expose
def index(self, **kwargs):

    schema = Schema({
        'files' : validate_files
    }, required = True, extra = True)

    kwargs = schema(kwargs)

したがって、実際には、という1 つのキーに従って、すべてのファイルの情報を含むポスト ヘッダー (ファイルのリストのようなものが最適です) が必要になりますが、取得できるのは などのfiles複数のキーだけです...files[0]files[1]

どうすればこれにアプローチできますか? すべての情報を含む配列を手動で作成するfiles必要がありますか、それともより一般的または実用的な方法がありますか?

解決策(saajの提案に従う):

schema_dict = {
    'name' : All(Length(min=3, msg="Can't believe that there is a name less than 3 characters...")),
    # ...
    }

# validate files
isPart = lambda v: isinstance(v, cherrypy._cpreqbody.Part)      
files1 = [a for a in kwargs.values() if isPart(a)]
files2 = [a for a in cherrypy.request.params.values() if isPart(a)]
assert files1 == files2

for file in files1:
    # for each file add dict entry and route to validation function
    schema_dict.update({file.name : validate_file}) 

schema = volu.Schema(schema_dict, required = True, extra = True)

このように、Schema明らかに他の多くのフィールドを含むことができます。送信されたファイルは、一般的に任意のSchema. 涼しい!

4

1 に答える 1

1

リクエストからファイル パーツを取得するだけです (フォームに他のタイプのパーツが含まれていない場合は、リクエストのパラメーターをそのまま取得できます)。

@cherrypy.expose
def index(self, **kwargs):
  isPart = lambda v: isinstance(v, cherrypy._cpreqbody.Part)
  files1 = [a for a in kwargs.values() if isPart(a)]
  files2 = [a for a in cherrypy.request.params.values() if isPart(a)]

  assert files1 == files2
  print(files1) # pass it where you want to

関連する CherryPy の質問:アップロードのパフォーマンス非同期アップロード

于 2015-06-29T13:25:16.260 に答える