2013-05-11 64 views
6

這是我目前用來從谷歌驅動器讀取文件到谷歌應用程序引擎blobstore的代碼。如何從谷歌驅動器中讀取大文件到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; 
    } 

這適用於小文件,但如果文件大於25MB,則會出現錯誤。有沒有更好的方式來做我想做的事情?

這是錯誤我看到

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) 

我要補充一點,

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

回報

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

App Engine限制HTTP消息體的大小。 – Linuxios 2013-05-11 17:48:17

+0

我意識到這是發生了什麼,但沒有辦法解決這個問題嗎?我可以將大文件讀入blobstore非常重要。也許我需要在多條消息中閱讀它。 – rvabdn 2013-05-11 18:14:16

+0

我可以通過blobstoreservice從我的計算機上傳我需要的文件,但這並不是很好,因爲我需要通過驅動器界面來完成。 – rvabdn 2013-05-11 19:31:03

回答

3

您可以從塊驅動器下載文件。在您的下載請求中使用Range標頭,如Google Drive documentation中所述。

Range: bytes=500-999 
+0

非常感謝!這正是我所希望的。 – rvabdn 2013-05-13 16:30:03

+0

Nate表示還有配額可以下載的字節數。我目前在50MB左右得到一個'urlfetch.Fetch()'異常。 (請注意,我不是付費用戶。:-)請參閱https://developers.google.com/appengine/docs/quotas#UrlFetch – 2013-11-18 22:17:32

0

這FilsService & FileWriteChannel API已棄用,取而代之的App Engine的GCS客戶端。

相關問題