2017-02-16 4 views
1

J'essaye de déboguer du code GAE sur mon serveur de développement local, mais j'ai frappé un mur. Le code utilise le service Blobstore de Google pour faciliter les téléchargements de fichiers. Le code fonctionne très bien sur la production mais pas sur mon serveur de développement local. J'utilise le modèle standard de Google en incluant mon action de formulaire dans mon jsp blobstoreService.createUploadUrl("/uploadSurvey") puis en appelant blobstoreService.getUploads(request) dans ma servlet.Problèmes de blobstore avec les outils cloud GAE et le serveur de développement local

Le fichier est téléchargé correctement (je peux voir à l'aide de la console d'administration locale), mais l'appel à getUploads() lance l'exception: java.lang.IllegalStateException: Must be called from a blob upload callback request.

regardant la demande dans le débogueur, l'blobkey attribut requis est introuvable , ni aucun des autres paramètres d'entrée dans le formulaire. En regardant la requête brute (celle envoyée à/_ah/upload/...), les paramètres du formulaire sont présents. J'utilise les outils google cloud app-engine-plugin, qui utilise le serveur dev de gcloud python pour exécuter la guerre générée. Je réalise que blobstore est une ancienne fonctionnalité GAE, mais comme ce code fonctionne sur prod, je préférerais ne pas avoir à passer au sous-système plus récent.

Quelqu'un peut-il me dire où trouver tout cela sur mon serveur de développement?

Merci,

- Dave

P.S. ci-dessous est la demande transmise à mon servlet après que le fichier téléchargé a été dépouillé:

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 

Mise à jour:

Je glissai le débogage à http_proxy.py dans le répertoire gcloud de devserver2 et observé ce type de contenu étant transmis. Je suis encore plus confus maintenant, comme il semble que le contenu est présent ...

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

Répondre

0

je me suis dit une solution, mais je pense qu'il ya un bug ici les gens de Google ont besoin de regarder. Le serveur python dev de Cloud Tools ne mettait pas l'élément d'en-tête X-AppEngine-BlobUpload dans l'en-tête de demande réécrit. J'ai modifié blob_upload.py et http_proxy.py pour cela (dans tools/devserver2 sous google-cloud-sdk). J'ai ensuite dû allumer du code à partir de la base de code du serveur de production propre à Google, ParseBlobUploadFilter.java, pour traiter la charge utile de requête non standard et construire les attributs de requête manquants et rendre accessibles les paramètres de requête d'origine. Bien sûr, ce chemin de code ne doit être utilisé que sur un serveur de développement local. ce code est correctement appelé par Google App Engine.