2012-06-26 16 views
7

I BLOB sono memorizzati nel mio Blobstore e voglio trasferire questi file su Google Drive. Quando uso il Google App Engine UrlFetchServiceCome inviare un file di grandi dimensioni (> 5 mb) da Blobstore a Google Drive?

URLFetchService fetcher = URLFetchServiceFactory.getURLFetchService(); 
URL url = new URL("https://www.googleapis.com/upload/drive/v1/files"); 
HTTPRequest httpRequest = new HTTPRequest(url, HTTPMethod.POST); 
httpRequest.addHeader(new HTTPHeader("Content-Type", contentType)); 
httpRequest.addHeader(new HTTPHeader("Authorization", "OAuth " + accessToken)); 
httpRequest.setPayload(buffer.array()); 
Future<HTTPResponse> future = fetcher.fetchAsync(httpRequest); 
try { 
    HTTPResponse response = (HTTPResponse) future.get(); 
} catch (Exception e) { 
    log.warning(e.getMessage()); 
} 

Problema: Quando il file è superiore a 5 MB, si supera il limite della dimensione richiesta UrlFetchService (Link: https://developers.google.com/appengine/docs/java/urlfetch/overview#Quotas_and_Limits)

Alternativa: Utilizzando API Google drive ho questo codice:

File body = new File(); 
body.setTitle(title); 
body.setDescription(description); 
body.setMimeType(mimeType); 

// File's content. 
java.io.File fileContent = new java.io.File(filename); 
FileContent mediaContent = new FileContent(mimeType, fileContent); 

File file = service.files().insert(body, mediaContent).execute(); 

Problemi con questa soluzione: FileOutputStream non è supportato su Google App Engine per gestire byte [] letti da Blobstore.

Qualche idea?

risposta

6

Per eseguire questa operazione, utilizzare il caricamento ripristinabile con blocchi di dimensioni inferiori a 5 megabyte. È un'operazione semplice nel client Java dell'API di Google per Drive. Ecco un esempio di codice adattato dal codice dell'unità che hai già fornito.

File body = new File(); 
body.setTitle(title); 
body.setDescription(description); 
body.setMimeType(mimeType); 

java.io.File fileContent = new java.io.File(filename); 
FileContent mediaContent = new FileContent(mimeType, fileContent); 

Drive.Files.Insert insert = drive.files().insert(body, mediaContent); 
insert.getMediaHttpUploader().setChunkSize(1024 * 1024); 
File file = insert.execute(); 

Per ulteriori informazioni, vedere i javadocs per le classi rilevanti:

+0

Grazie per adattare il mio codice Drive. Aggiorno la mia applicazione sfruttando il caricamento ripristinabile. Dopo aver caricato il codice per Google App Engine ottengo java.lang.NoSuchMethodError: com.google.api.services.drive.Drive $ file $ Insert.getMediaHttpUploader() lcom/google/api/client/googleapis/MediaHttpUploader; Ho bisogno di cercare un po 'di più su questo ... – Martin

+0

Quale versione di google-api-java-client hai? È l'ultima? Vedi qui: http://code.google.com/p/google-api-java-client/ –

+0

Grazie Vic! Dopo aver aggiornato tutte le librerie API utilizzate, il codice fornito funziona perfettamente! – Martin

Problemi correlati