私は繰り返し可能なフォームフィールドを持っています:
<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
. 涼しい!