2017-02-16 64 views
1

我想調試我的本地開發服務器上的一些GAE代碼,但已經打了一堵牆。該代碼使用Google的Blobstore服務來促進文件上傳。該代碼在生產環境中工作得很好,但不在我的本地開發服務器上。Blobstore問題GAE雲工具和本地開發服務器

我在我的jsp blobstoreService.createUploadUrl("/uploadSurvey")中使用包含作爲我的表單動作的標準Google模式,然後在我的servlet中調用blobstoreService.getUploads(request)

的文件正確上傳(我可以使用本地管理控制檯看到它),但是調用getUploads()拋出異常:java.lang.IllegalStateException: Must be called from a blob upload callback request.

看在調試器的請求,要求blobkey屬性未找到,也沒有任何其他輸入參數的形式。查看原始請求(發送給/ _ah/upload/...的請求),表單參數存在。

我使用google雲工具app-engine-plugin,它使用gcloud python開發服務器來運行生成的war。

我認識到blobstore是一個較老的GAE功能,但由於此代碼在產品上「工作」,我寧願不必切換到較新的子系統。

任何人都能夠給我一個線索在哪裏尋找得到這一切在我的開發服務器上工作?

感謝,

- 戴夫

附:下面是上傳文件後轉發到我的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 

更新:

我加了一些調試http_proxy.py的gcloud devserver2目錄下,並觀察該內容類型爲轉發。我更糊塗了,因爲它看起來像的內容存在...

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

回答

0

我想出了一個解決辦法,但我不認爲這是這裏的鄉親谷歌需要看的錯誤。雲工具python dev服務器沒有將重要的X-AppEngine-BlobUpload頭元素放入重寫的請求頭中。我修改了blob_upload.py和http_proxy.py來執行此操作(在google-cloud-sdk下的tools/devserver2中)。然後,我必須從Google自己的生產服務器代碼庫ParseBlobUploadFilter.java中提取一些代碼來處理非標準請求有效內容,並構建缺少的請求屬性並使原始請求參數可訪問。當然,這個代碼路徑只能在本地開發服務器上運行;此代碼已由Google App Engine正確調用。

相關問題