2012-06-26 24 views
7

Tôi có các đốm màu được lưu trữ trong Blobstore của mình và muốn đẩy các tệp này vào Google Drive. Khi tôi sử dụng Google App Engine UrlFetchServiceCách đăng một tệp lớn (> 5 mb) từ Blobstore lên 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()); 
} 

Vấn đề: Khi các tập tin vượt quá 5 mb, nó vượt quá giới hạn kích thước yêu cầu UrlFetchService (Link: https://developers.google.com/appengine/docs/java/urlfetch/overview#Quotas_and_Limits)

Alternative: Sử dụng API Google Drive Tôi có mã này:

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

Vấn đề với giải pháp này: FileOutputStream không được hỗ trợ trên Google App Engine để quản lý byte [] đọc từ Blobstore.

Bất kỳ ý tưởng nào?

Trả lời

6

Để thực hiện việc này, hãy sử dụng tải lên có thể tiếp tục lại với các khối nhỏ hơn 5 megabyte. Việc này rất đơn giản trong Ứng dụng khách Java API của Google cho Drive. Dưới đây là mẫu mã được điều chỉnh từ mã Drive bạn đã cung cấp.

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

Để biết thêm thông tin, vui lòng xem javadocs cho các lớp liên quan:

+0

Cám ơn thích ứng đang Ổ của tôi. Tôi cập nhật ứng dụng của mình bằng cách tận dụng tải lên có thể tiếp tục lại. Sau khi tải mã này lên Google App Engine, tôi nhận được java.lang.NoSuchMethodError: com.google.api.services.drive.Drive $ Files $ Insert.getMediaHttpUploader() Lcom/google/api/client/googleapis/MediaHttpUploader; Tôi cần nghiên cứu thêm một chút về điều này ... – Martin

+0

Bạn đang sử dụng phiên bản nào của google-api-java-client? Là nó mới nhất? Xem tại đây: http://code.google.com/p/google-api-java-client/ –

+0

Cảm ơn Vic! Sau khi cập nhật tất cả các thư viện API đã sử dụng, mã được cung cấp của bạn hoạt động hoàn toàn tốt đẹp! – Martin

Các vấn đề liên quan