【问题标题】:AppEngine BlobStore upload failing with a request that works in the Development EnvironmentAppEngine BlobStore 上传失败,请求在开发环境中有效
【发布时间】:2010-05-23 20:14:40
【问题描述】:

我有一个 AppEngine 应用程序,它使用 blobstore 来存储用户提供的图像数据。当我从 Chrome 中的表单将图像上传到该应用程序时,它工作正常。当我尝试从 Android 应用程序上传图像时,它失败了。如果我在开发服务器上运行,这两种方法都可以正常工作,但 Android 上传对实时服务不起作用。

这是来自 Chrome 的请求:

POST /_ah/upload/?userToken=11001/AMmfu6ZCyMQQ9YdiXal3SmSXIRTQIuSRXkNc-i3JmU0fqx_kJbUJ2OMLcS2lXhVJSK4qs7regViTKzOPz5ejoZYi0nAD5o8vNltiOViQw6DZO7_byZz3Ut0/ALBNUaYAAAAAS_lusgPMAGmpPrg0BuNsJyymX-57ob4i/ HTTP/1.1
Host: photohuntservice.appspot.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.1.249.1064 Safari/532.5
Referer: http://photohuntservice.appspot.com/debug_newpuzzle?userToken=11001
Content-Length: 60360
Cache-Control: max-age=0
Origin: http://photohuntservice.appspot.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarybl05YLmLbFRf2MzN
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="userToken"

11001
------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="img"; filename="Photo_020908_001.jpg"
Content-Type: image/jpeg

<image data>
------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="longitude"

-122.084095
------WebKitFormBoundarybl05YLmLbFRf2MzN
Content-Disposition: form-data; name="latitude"

37.422006
------WebKitFormBoundarybl05YLmLbFRf2MzN--

这是来自我的客户的请求(在 Android 上用 Java 编写,但我认为这无关紧要):

POST /_ah/upload/?userToken=11001/AMmfu6Zf9an6AU4lT9UuhIpxOZyOYb1LMwimFpeSh8zr6J1sX9F2ddJW3Qlsw0kwV3oALv-TNPWRQ6g4_Dgwk0UTwF47bbc78Yl44kDeV69MydTuR3N46S4/ALBNUaYAAAAAS_mMr3CYqTg3aVBDjhRxP0DyyRdvotyG/ HTTP/1.1
Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryhdyNAhmOouRDGErG
Cache-Control: max-age=0
Accept: */*
Origin: http://photohuntservice.appspot.com
Connection: keep-alive
Referer: http://photohuntservice.appspot.com/getuploadurl?userToken=11001
Content-Length: 2638
Host: photohuntservice.appspot.com
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
Expect: 100-Continue

------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="userToken"

11001
------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="img";filename="PhotoHunt.jpg"
Content-Type: image/jpeg

<image data>
------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="latitude"

37.422006
------WebKitFormBoundaryhdyNAhmOouRDGErG
Content-Disposition: form-data; name="longitude"

-122.084095
------WebKitFormBoundaryhdyNAhmOouRDGErG--

在这两种情况下,用于捕获请求的 AppEngine Python 代码是相同的:

  class UploadPuzzle( blobstore_handlers.BlobstoreUploadHandler ):
        def post(self):
            upload_files = self.get_uploads(  )

问题是在生产 AppEngine 服务上运行时,当我的客户端应用发出请求时,self.get_uploads() 返回一个空列表。这两个请求在开发服务器上都返回了我所期望的内容(其中包含一个 blob_info 的列表),而 Chrome 在这两种情况下都返回了我所期望的内容。

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    原来问题出在这一行:

    Content-Disposition: form-data; name="img";filename="PhotoHunt.jpg"
    

    应该是这样的:

    Content-Disposition: form-data; name="img"; filename="PhotoHunt.jpg"
    

    生产服务器上的表单数据解析器比开发环境中的解析器更严格,分号和“文件名=”之间需要一个空格

    【讨论】:

    • 那个@#$%!生产服务器。 “文件名前面的空格肯定是多余的,让我清理一下”,我想。哦,我为整洁付出的代价。
    • 哇..!!!就是这样..!!在这个例子中我花了一段时间才弄清楚.. stackoverflow.com/a/3801665/8418 :)
    • +1,000,000 - 我被这个问题困扰了好几个小时。我不敢相信一个空格导致了这个错误。
    【解决方案2】:

    另一个选项可能是因为您添加了 URL 参数,这可以正常工作,但与 Blobstore 上传程序重定向到您的 servlet 的方式不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多