从数据存储控制台管理blobstore查看器看,很多文件都是0大小:
你能评论或说出为什么会这样吗?我认为我的文件上传代码非常干净,所以bug在哪里?
for upload in self.get_uploads():
try:
img = Image(reference=ad)
img.primary_image = upload.key()
img.put()
ad.put()
except:
pass
我怀疑我可以通过uploading a file向blobstore重新创建此错误,然后将创建文件和零上传。你怎么认为我应该解决这个错误呢?
谢谢
更新
我可以重现上传一个文件的错误并将其他字段留空,然后空白字段将创建空白数据存储文件:
<tr><td>
<div class="labelform">
<label>{% trans %}Post a photo{% endtrans %}</label>
</div></td><td>
<div class="adinput">
<input type="file" name="file" size="35" id="file" />{% trans %}Optional{% endtrans %}{{resize}}
</div>
</td></tr><tr><td>
<div class="labelform">
<label>{% trans %}Post a photo{% endtrans %}</label>
</div></td><td>
<div class="adinput">
<input type="file" name="file2" size="35" id="file2" /> {% trans %}Optional{% endtrans %}
</div></td></tr><tr><td>
<div class="labelform">
<label>{% trans %}Post a photo{% endtrans %}</label>
</div></td><td>
<div class="adinput">
<input type="file" name="file3" size="35" id="file3" /> {% trans %}Optional{% endtrans %}
</div>
</td></tr><tr><td>
<div class="labelform">
<label>{% trans %}Post a photo{% endtrans %}</label>
</div></td><td>
<input type="file" name="file4" size="35" id="file4" /> {% trans %}Optional{% endtrans %}
</td></tr><tr><td>
<div class="labelform">
<label>{% trans %}Post a photo{% endtrans %}</label></div></td><td><div class="adinput"><input type="file" name="file5" size="35" id="file5" /> {% trans %}Optional{% endtrans %}</div></td></tr><tr><td></td><td><div class="labelform"></div><div class="adinput">
<input type="submit" name="validate" value='{% trans %}Go{% endtrans %}' /></div></td></tr>
答案 0 :(得分:1)
您指定了多个文件字段,因此数据存储区正在尝试处理多个文件。这可能被认为是blobstore中的一个错误(在这种情况下你可以file one),但是如果你的浏览器提交空字段,我不清楚正确的响应是什么。
您可以通过删除空文件来解决此问题,或者(更好)通过使用Javascript自动添加和减去用户想要上传的实际文件数所需的文件输入字段。
答案 1 :(得分:1)
使用Google的实验代码(需要针对多个文件进行调整)。
my_upload = self.request.POST['file']
my_data = my_upload.file.read()
if len(my_data) > 0:
# Create the file
file_name = files.blobstore.create(mime_type='application/octet')
# Open the file and write to it
with files.open(file_name, 'b') as f:
f.write(my_data)
# Finalize the file. Do this before attempting to read it.
files.finalize(file_name)
# Get the file's blob key
blob_key = files.blobstore.get_blob_key(file_name)
self.response.out.write(blob_key)