Python 如何调试0 mb未命名上载?

Python 如何调试0 mb未命名上载?,python,google-app-engine,google-cloud-datastore,jinja2,blobstore,Python,Google App Engine,Google Cloud Datastore,Jinja2,Blobstore,从数据存储控制台admin blobstore viewer中查看,许多文件的大小为0: 你能评论一下或说一下为什么会发生这种情况吗?我认为我的文件上传代码非常干净,那么bug在哪里呢 for upload in self.get_uploads(): try: img = Image(reference=ad) img.primary_image = upload.key() img.put() ad.put()

从数据存储控制台admin blobstore viewer中查看,许多文件的大小为0:

你能评论一下或说一下为什么会发生这种情况吗?我认为我的文件上传代码非常干净,那么bug在哪里呢

for upload in self.get_uploads():
    try:
        img = Image(reference=ad)
        img.primary_image = upload.key()
        img.put()
        ad.put()
    except:
        pass
我怀疑我可以通过访问blobstore重新创建这个bug,然后创建文件和零上传。你认为我应该如何解决这个错误

多谢各位

更新

< >我可以复制一个文件上传的错误,剩下的字段是空白的,空白字段将创建空白数据存储文件:

<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>

{%trans%}发布照片{%endtrans%}
{%trans%}可选{%endtrans%}{{resize}
{%trans%}发布照片{%endtrans%}
{%trans%}可选{%endtrans%}
{%trans%}发布照片{%endtrans%}
{%trans%}可选{%endtrans%}
{%trans%}发布照片{%endtrans%}
{%trans%}可选{%endtrans%}
{%trans%}发布照片{%endtrans%}{%trans%}可选{%endtrans%}

您指定了多个文件字段,因此数据存储试图处理多个文件。这可能被认为是blobstore中的一个bug(在这种情况下,您可以),但是如果您的浏览器提交的是空字段,我不清楚正确的响应是什么


你可以通过删除空文件来解决这个问题,或者(更好的)使用Javascript根据用户想要上传的文件的实际数量自动添加和减少文件输入字段。

使用谷歌的实验代码(需要对多个文件进行调整)


你能试试你的怀疑,看看是不是真的?您的HTML表单是什么样子的?如果你登录self.get_上传会发生什么?谢谢你的提问。如果将一个文件与剩下的表单字段一起上传,则会在BubSt店中生成空白的未命名文件。我也用我的HTML表单更新了这个问题。谢谢@Nick Johnson的回答是的,这很好,但使用
blostoreuploadhandler
将生成文件格式和场景后面的其他内容,这会使发送更频繁。如果我使用for file upload而不是原始文件api,在原始文件api中我必须手动指定文件名和MIME类型,这样它就不会像blobstoreuploadhandler那样向前兼容,那么你同意我应该使用
blobstoreuploadhandler
吗?这回答了你在使用
blobstoreuploadhandler
处理多个文件上载时的问题。我的风格更适合于低级的“类似文件的API”,是的,它是实验性的,可能无法向前兼容。
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)