2012-03-17 10 views
6

Ho appena avuto successo nello scrivere il file nel cloud di Google Storage e leggerlo. Tutto va bene dopo schiero l'applicazione per AppSpot, ma ho ottenuto gli errori durante l'esecuzione di esso locale:Come accedere al file Archiviazione cloud dall'app in esecuzione in locale

INTERNAL_SERVER_ERROR 
    Caused by:java.io.IOException 
     at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:586) 
     at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:561) 
    ...... 

Se uno di voi sa come accedere a file di Google Cloud Storage da localhost?

risposta

7

L'ambiente di test degli sviluppatori di App Engine supporta una simulazione locale di Google Cloud Storage ma non fornisce l'accesso RPC alla cosa reale. Pertanto, il tuo codice dovrebbe funzionare in entrambi gli ambienti, ma dovresti pensare alle due modalità come ad avere spazi e contenuti del nome distinti. Quindi, se, ad esempio, il codice si aspetta di vedere un particolare bucket pippo contenente una barra degli oggetti, dovrai creare separatamente quel bucket/oggetto e assicurarti che contenga contenuti ragionevoli in modo che la modalità sviluppatore locale funzioni come previsto.

-1

Per eseguirlo "pseudo" localmente (come su una riga di comando), è necessario prima distribuirlo e quindi utilizzare HttpClient per connettersi al server. In questo modo è possibile interagire con il vostro servlet/jsp dalla riga di comando e non devono presentare forme con file allegati

codice di esempio [Si può certamente ottenere più creativo di quello]

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.methods.HttpUriRequest; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.client.ClientProtocolException; 


public class FileUploaderClient { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws ClientProtocolException, IOException{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://<app-version>.<app-name>.appspot.com/<servlet-name>"); 
     MultipartEntity reqEntity = new MultipartEntity(); 
     FileBody bin = new FileBody(new File("<File you want to upload>")); 
     reqEntity.addPart("file", bin); 
     httppost.setEntity(reqEntity); 
     HttpResponse response = httpclient.execute(httppost); 
     System.out.println(response.getStatusLine()); 

    } 

} 

Ora si avrebbe la possibilità di chiamare il servlet in un ciclo ad esempio invece di inviare il modulo più volte

0

Sono stato in grado di trovare e utilizzare il servizio simulato di cui sopra. Sfortunatamente per questo thread, non conosco Java. Ma è l'utilizzo in Python è il seguente ...

$ python2.7 google_appengine/google/appengine/tools/api_server.py --application myapp 

(Si noti che api_server.py richiede Python 2.7, perché dipende dal modulo argparse.)

Qualcun altro dovrà capire come fare lo stesso in Java. Scusate. :(

EDIT: L'api_server.py si trova nella directory di base:

$ python2.7 google_appengine/api_server.py