Web2py:如何获取 FieldStorage 中的项目?
Web2py: How to get items in FieldStorage?
我有一个接受图片上传的表单:
<form name="upload" enctype="multipart/form-data" method="post" class="form-horizontal">
<div class="control-group">
<div class="span2">
<label for="image" class="control-label">Upload image:</label>
</div>
<div class="span10">
<input id="image" name="image" type="file" class="span7" accept="image/*"/>
</div>
</div>
<div class="form-group">
<div class="span2"></div>
<div class="span10">
<button class="btn btn-medium btn-primary" type="submit">Submit</button>
</div>
</div>
</form>
当我request.vars['image']
时,返回如下:
FieldStorage('image', 'a.png', '\x89PNG\r\n\x1a\n\x00...')
如何访问这些项目?如果我尝试像使用 dict 一样使用它,我会收到一个错误,指出该对象不可索引。我以前从未使用过 FieldStorage,所以我不确定我需要做什么才能访问这些数据。
如果其他人有兴趣,这行得通:
request.vars['image'].filename
request.vars['image'].value
分别为文件名和二进制数据。只需要一个可用属性的快速摘要:http://python.about.com/od/cgiformswithpython/ss/pycgitut1_3.htm
如果您在尝试处理表单之前尝试检查文件的某些方面,这将非常有用。我想获取上传文件的 sha256
哈希值,并确保它之前没有被上传过。上传在字段 Field('file', 'upload')
.
本来我是用下面的,但是这个消耗了request.vars.file
里面的数据,所以处理成功后写入磁盘的文件是空的
file_contents = request.vars.file.read()
form.vars.file_hash = hashlib.sha256(file_contents).hexdigest()
form.vars.file_length = len(file_contents)
但是,在 datasci 的答案下方的更新代码中,您可以访问数据而无需从 request.vars.file
中使用数据。可能很明显,但我花了很长时间才弄清楚发生了什么!
# Is there a file - the value will be None when the page first loads and
# can be 'str' if submit is pressed without a file selected.
if request.vars.file != None and not isinstance(request.vars.file, str):
form.vars.file_name = request.vars.file.filename
form.vars.file_hash = hashlib.sha256(request.vars.file.value).hexdigest()
form.vars.file_size= len(request.vars.file.value)
if form.process(onvalidation=validate_dataset_upload).accepted:
# notify upload has worked
response.flash = ('Upload successful. A validation check will be run and '
'you will get an email with the results when it finishes.')
所有这些意味着 validate_dataset_upload
函数现在可以检查 form.vars.file_hash
是否已经存在于底层 table.
我有一个接受图片上传的表单:
<form name="upload" enctype="multipart/form-data" method="post" class="form-horizontal">
<div class="control-group">
<div class="span2">
<label for="image" class="control-label">Upload image:</label>
</div>
<div class="span10">
<input id="image" name="image" type="file" class="span7" accept="image/*"/>
</div>
</div>
<div class="form-group">
<div class="span2"></div>
<div class="span10">
<button class="btn btn-medium btn-primary" type="submit">Submit</button>
</div>
</div>
</form>
当我request.vars['image']
时,返回如下:
FieldStorage('image', 'a.png', '\x89PNG\r\n\x1a\n\x00...')
如何访问这些项目?如果我尝试像使用 dict 一样使用它,我会收到一个错误,指出该对象不可索引。我以前从未使用过 FieldStorage,所以我不确定我需要做什么才能访问这些数据。
如果其他人有兴趣,这行得通:
request.vars['image'].filename
request.vars['image'].value
分别为文件名和二进制数据。只需要一个可用属性的快速摘要:http://python.about.com/od/cgiformswithpython/ss/pycgitut1_3.htm
如果您在尝试处理表单之前尝试检查文件的某些方面,这将非常有用。我想获取上传文件的 sha256
哈希值,并确保它之前没有被上传过。上传在字段 Field('file', 'upload')
.
本来我是用下面的,但是这个消耗了request.vars.file
里面的数据,所以处理成功后写入磁盘的文件是空的
file_contents = request.vars.file.read()
form.vars.file_hash = hashlib.sha256(file_contents).hexdigest()
form.vars.file_length = len(file_contents)
但是,在 datasci 的答案下方的更新代码中,您可以访问数据而无需从 request.vars.file
中使用数据。可能很明显,但我花了很长时间才弄清楚发生了什么!
# Is there a file - the value will be None when the page first loads and
# can be 'str' if submit is pressed without a file selected.
if request.vars.file != None and not isinstance(request.vars.file, str):
form.vars.file_name = request.vars.file.filename
form.vars.file_hash = hashlib.sha256(request.vars.file.value).hexdigest()
form.vars.file_size= len(request.vars.file.value)
if form.process(onvalidation=validate_dataset_upload).accepted:
# notify upload has worked
response.flash = ('Upload successful. A validation check will be run and '
'you will get an email with the results when it finishes.')
所有这些意味着 validate_dataset_upload
函数现在可以检查 form.vars.file_hash
是否已经存在于底层 table.