2013-05-11 25 views
6

Đây là mã mà tôi hiện đang sử dụng để đọc tệp từ ổ google vào blobstore của công cụ ứng dụng google.Cách đọc các tệp lớn từ google drive vào gae blobstore

private BlobKey getBlobKey(File f, DriveObject driveObject) 
      throws IOException, MalformedURLException { 

     Drive service = ((GoogleDrive) driveObject).getService(); 

     byte[] buffer = new byte[(int) f.getFileSize().intValue()]; 
     GenericUrl url = new GenericUrl(f.getDownloadUrl()); 
     HttpResponse response = service.getRequestFactory() 
        .buildGetRequest(url).execute(); 

     InputStream is = response.getContent(); 

     FileService fileService = FileServiceFactory.getFileService(); 
     AppEngineFile file = null; 
     boolean lock = true; 
     try { 
      file = fileService.createNewBlobFile("application/zip"); 
      FileWriteChannel writeChannel = fileService.openWriteChannel(
         file, lock); 

      int len; 
      while ((len = is.read(buffer)) >= 0) { 
      ByteBuffer bb = ByteBuffer.wrap(buffer, 0, len); 
      writeChannel.write(bb); 
      } 
      writeChannel.closeFinally(); 

     } catch (IOException e) { 
       // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

      BlobKey bk = fileService.getBlobKey(file); 

     return bk; 
    } 

Điều này làm việc tốt cho các tệp nhỏ nhưng sẽ gây ra lỗi nếu tệp lớn hơn ~ 25MB. Có cách nào tốt hơn để làm những gì tôi đang cố gắng làm không?

Đây là lỗi tôi thấy

Uncaught exception from servlet 
com.google.appengine.api.urlfetch.ResponseTooLargeException: The response from url https://doc-0o-bs-docs.googleusercontent.com/docs/securesc/97o44sjeam7f23b1flie9m3qqidhrago/97q4akk8bmpub24itqhclo1vakjusu84/1368259200000/14350098165097390874/14350098165097390874/0ByS2XCxCEzq-NUVuajAwWGVoR1U?h=16653014193614665626&e=download&gd=true was too large. 
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:132) 
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:43) 
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:417) 
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:296) 
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getResponseCode(URLFetchServiceStreamHandler.java:149) 
    at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:37) 
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:95) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:980) 

tôi nên thêm rằng

Drive service = ((GoogleDrive) driveObject).getService(); 

lợi nhuận

new Drive.Builder(httpTransport, jsonFactory, cred) 
      .build() 
+0

Máy ứng dụng hạn chế kích thước của nội dung thư HTTP. – Linuxios

+0

Tôi nhận ra đó là những gì đang xảy ra nhưng không có cách nào xung quanh điều này? Nó là khá quan trọng mà tôi có thể đọc các tập tin lớn vào blobstore. Có lẽ tôi cần đọc nó trong nhiều tin nhắn. – rvabdn

+0

Tôi có thể tải lên các tập tin tôi cần từ máy tính của tôi thông qua một blobstoreservice nhưng điều này là không tốt như tôi cần để có thể làm điều đó thông qua giao diện ổ đĩa. – rvabdn

Trả lời

3

Bạn có thể tải các tập tin từ Drive trong khối. Sử dụng tiêu đề Range trong yêu cầu tải xuống của bạn như được ghi trong Google Drive documentation.

Range: bytes=500-999 
+0

Xin cảm ơn! Đó là chính xác những gì tôi đã hy vọng. – rvabdn

+0

Nate rằng vẫn còn hạn ngạch số byte bạn có thể tải xuống. Tôi hiện đang nhận được một ngoại lệ 'urlfetch.Fetch()' ở khoảng mốc 50MB. (Lưu ý rằng tôi không phải là người dùng thanh toán. :-) Xem https://developers.google.com/appengine/docs/quotas#UrlFetch –

0

FilsService & FileWriteChannel api này đã không được dùng cho khách hàng App Engine GCS.

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