2015-06-17 33 views
1

我正在使用Java Drive API的Java客戶端庫上傳一些文本文件並將它們轉換爲Google文檔格式。該代碼在Google App Engine上運行。主要代碼段如下所示:嘗試使用Java客戶端庫向Google Drive插入大文本文件時出現超時異常

File fileMetadata = new File(); 
    fileMetadata.setTitle("Document title"); 
    fileMetadata.setDescription("Desc goes here"); 
    fileMetadata.setMimeType("text/plain; charset=utf-8"); 

    ByteArrayContent byteArrayContent = ByteArrayContent.fromString(
      "text/plain; charset=utf-8", "Text file's content goes here"); 

    Drive.Files.Insert insertRequest = driveService.files() 
      .insert(fileMetadata, byteArrayContent).setConvert(true); 

    File insertedFile = insertRequest.execute(); 

對於小型文本文件,上面的代碼工作正常。但是,當文本文件都是大(也許還有一些我不知道的一些其他因素),它會拋出以下異常:

Uncaught exception from servlet 
java.net.SocketTimeoutException: Timeout while fetching URL: https://www.googleapis.com/upload/drive/v2/files?convert=true&uploadType=resumable&upload_id=AEnB2UpPDz6jvM8zO2zPFxFHmoCiisplOf1Ui5fngZdI4qqoK6hwt_wtOt89RcW3QautW9FPlHKfMznYA4gmo95qdWthJQgWpQ 
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:145) 
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:45) 
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:419) 
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:298) 
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getResponseCode(URLFetchServiceStreamHandler.java:151) 
    at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:36) 
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965) 
    at com.google.api.client.googleapis.media.MediaHttpUploader.executeCurrentRequestWithoutGZip(MediaHttpUploader.java:545) 
    at com.google.api.client.googleapis.media.MediaHttpUploader.resumableUpload(MediaHttpUploader.java:417) 
    at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:336) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:418) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460) 

有些人說這是由於URLConnnection的超時。但是我正在使用Java客戶端庫,它不允許我明確設置超時。此外,上述例外發生在insertRequest.execute()呼叫後至少30秒。

我懷疑Java客戶端庫已經設置了30秒的內部超時...我希望一些Google軟件工程師可以看一看。

任何想法將不勝感激。非常感謝。

回答

0

當您上傳大文件時,會出現此錯誤。嘗試實施可恢復的上傳。你可以閱讀更多有關方法以及在以下網頁樣本:https://developers.google.com/drive/web/manage-uploads#resumable

基於Java庫,你應該在insertRequest.execute(前添加以下代碼)

MediaHttpUploader uploader = insert.getMediaHttpUploader(); 
uploader.setDirectUploadEnabled(useDirectUpload); 
uploader.setProgressListener(new FileUploadProgressListener()); 
+0

謝謝您建議@裏維羅。但是,切換到可恢復上傳後,我仍然保持不變。 – derren

+0

但是,在刪除'setConvert(true)'後,超時錯誤消失了。我認爲轉換佔用了大部分時間,這是導致超時錯誤的罪魁禍首。無論如何,再次感謝。 – derren

相關問題