Blobstore与GAE云工具和本地开发服务器的问题

时间:2017-02-16 16:47:02

标签: java google-app-engine google-cloud-platform blobstore

我正在尝试在我的本地开发服务器上调试一些GAE代码但是已经碰壁了。该代码使用Google的Blobstore服务来促进文件上传。代码在生产时工作得很好,但在我的本地开发服务器上却没有。

我正在使用标准的Google模式,在我的jsp blobstoreService.createUploadUrl("/uploadSurvey")中包含我的表单操作,然后在我的servlet中调用blobstoreService.getUploads(request)

文件已正确上传(我可以使用本地管理控制台查看),但对getUploads()的调用会引发异常:java.lang.IllegalStateException: Must be called from a blob upload callback request.

查看调试器中的请求,找不到所需的blobkey属性,表单中也没有任何其他输入参数。查看原始请求(调度到/ _ah / upload / ...的请求),表单参数存在。

我使用谷歌云工具app-engine-plugin,它使用gcloud python dev服务器来运行生成的战争。

我意识到blobstore是一个较旧的GAE功能,但由于此代码在prod上“正常工作”,我宁愿不必切换到更新的子系统。

任何人都能给我一个线索,想知道我的开发服务器上有什么工作吗?

谢谢,

- 戴夫

P.S。下面是在上传文件被删除后转发到我的servlet的请求:

POST /uploadSurvey HTTP/1.1
Accept-Encoding: identity
X-APPENGINE-BACKEND-ID: 8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
X-APPENGINE-SERVER-NAME: localhost
Cookie: JSESSIONID=5773y31x3eut
X-Appengine-User-Email: 
X-APPENGINE-DEFAULT-VERSION-HOSTNAME: localhost:8888
X-APPENGINE-SERVER-PROTOCOL: HTTP/1.1
X-Appengine-User-Organization: 
X-APPENGINE-DEV-SCRIPT: unused
ORIGIN: http://localhost:8888
X-Appengine-User-Id: 
Accept-Language: en-us
X-APPENGINE-SERVER-SOFTWARE: Development/2.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8
X-Appengine-User-Nickname: 
Host: localhost:8888
X-Appengine-Dev-Request-Id: wCTAonUKrB
Content-Type: multipart/form-data; boundary="===============1477989950756010976=="
Content-Length: 1372
X-APPENGINE-REQUEST-LOG-ID: 5e8eaef5aff4add89b774badea1fd3a30da8be
X-Appengine-User-Is-Admin: 0
UPGRADE-INSECURE-REQUESTS: 1
X-APPENGINE-SERVER-PORT: 8888
Referer: http://localhost:8888/settings
X-AppEngine-Country: ZZ
X-APPENGINE-REQUEST-ID-HASH: BFD4FDDA
X-APPENGINE-REMOTE-ADDR: ::1

更新

我在gcloud devserver2目录下的http_proxy.py中添加了一些调试,并观察了转发的内容类型。我现在更加困惑,因为看起来内容已经存在......

    --===============5516630363169856841==
Content-Type: message/external-body; blob-key="XOQvaKc1cdczcwkIHfRFOw=="; access-type="X-AppEngine-BlobKey"
Content-Disposition: form-data; name="myFile"; filename="Naro Group - SNHU - Sales Readiness Assessment - Dec 2016.xls"

Content-Type: application/vnd.ms-excel
Content-Length: 164352
Content-MD5: NjBiNjI0N2M3MjZiMzc3NWMxZDQxYmM5YTU2YmM5YmM=
content-disposition: form-data; name="myFile"; filename="Naro Group - SNHU - Sales Readiness Assessment - Dec 2016.xls"
X-AppEngine-Upload-Creation: 2017-02-16 20:17:05.729401


--===============5516630363169856841==
Content-Type: text/plain
Content-Disposition: form-data; name="newSurveyId"

10001
--===============5516630363169856841==
Content-Type: text/plain
Content-Disposition: form-data; name="newSurveyName"

N
--===============5516630363169856841==
Content-Type: text/plain
Content-Disposition: form-data; name="newUserMessage"


--===============5516630363169856841==
Content-Type: text/plain
Content-Disposition: form-data; name="selectedClient"

6
--===============5516630363169856841==
Content-Type: text/plain
Content-Disposition: form-data; name="selectedPsf"

3
--===============5516630363169856841==
Content-Type: text/plain
Content-Disposition: form-data; name="selectedSection"

1
--===============5516630363169856841==--

1 个答案:

答案 0 :(得分:0)

我想出了一个解决方法,但我确实认为谷歌人需要关注一个错误。 Cloud Tools python dev服务器没有将所有重要的X-AppEngine-BlobUpload标头元素放入重写的请求标头中。我修改了blob_upload.py和http_proxy.py来执行此操作(在google-cloud-sdk下的tools / devserver2中)。然后我不得不从谷歌自己的生产服务器代码库ParseBlobUploadFilter.java中加入一些代码来处理非标准请求有效负载并构建缺少的请求属性并使原始请求参数可访问。当然,只有在本地开发服务器上运行时才应该使用此代码路径;此代码由Google App Engine正确调用。