如何调试0 mb未命名的上传?

时间:2011-11-17 08:15:20

标签: python google-app-engine google-cloud-datastore jinja2 blobstore

从数据存储控制台管理blobstore查看器看,很多文件都是0大小:

enter image description here

你能评论或说出为什么会这样吗?我认为我的文件上传代码非常干净,所以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>

2 个答案:

答案 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)