2012-06-26 10 views
7

Mam bloby przechowywane w moim Blobstore i chcę je przesłać na Dysk Google. Kiedy używam UrlFetchService Google App EngineJak umieścić duży plik (> 5 mb) z Blobstore na Dysku Google?

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()); 
} 

Problem: Gdy plik przekracza 5 MB, to przekracza limit wielkości żądanie UrlFetchService (Link: https://developers.google.com/appengine/docs/java/urlfetch/overview#Quotas_and_Limits)

Alternatywa: Używanie Dysk Google API mam ten kod:

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(); 

problem z tego rozwiązania: FileOutputStream nie jest obsługiwany w Google App Engine do zarządzania bajtem [] czytanym z Blobstore.

Wszelkie pomysły?

Odpowiedz

6

Aby to zrobić, używaj wznawiania przesyłania z porcjami mniejszymi niż 5 megabajtów. Jest to łatwe do zrobienia w kliencie Java dla Dysków Google API. Oto próbka kodu dostosowana z już dostarczonego kodu Dysku.

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(); 

Aby uzyskać więcej informacji, zobacz Javadocs do odpowiednich klas:

+0

Dzięki za przystosowanie mojego kodu napędu. Aktualizuję swoją aplikację, wykorzystując wznawianie przesyłania. Po wgraniu tego kodu na Google App Engine mam java.lang.NoSuchMethodError: com.google.api.services.drive.Drive $ Pliki $ Insert.getMediaHttpUploader() Lcom/google/api/klient/googleapis/MediaHttpUploader; Potrzebuję trochę więcej badań na ten temat ... – Martin

+0

Którą wersję klienta google-api-java masz? Czy to najnowszy? Zobacz tutaj: http://code.google.com/p/google-api-java-client/ –

+0

Dzięki Vic! Po aktualizacji wszystkich używanych bibliotek API Twój podany kod działa doskonale! – Martin

Powiązane problemy