2013-08-26 136 views
1

我試圖使用Java API這樣上傳到YouTube的視頻:簡歷上傳使用Java的YouTube API

private Video uploadVideo(final YouTube youtube, final Video video, final InputStreamContent mediaContent) 
      throws IOException { 
     YouTube.Videos.Insert videoInsert = youtube.videos().insert("snippet,statistics,status", video, mediaContent); 

     MediaHttpUploader uploader = videoInsert.getMediaHttpUploader(); 
     uploader.setDirectUploadEnabled(false); 
     uploader.setProgressListener(progressListener); 
     return videoInsert.execute(); 
    } 
} 

我有一個緩慢和不穩定的互聯網連接,這將是非常有益的,如果我能得到可恢復的上傳工作。文檔herehere似乎暗示我「setDirectUploadEnabled(false)」應該完全做到這一點。那麼......顯然不是。

如果我的互聯網連接中斷,拋出IOException並且沒有自動上傳繼續。

如何恢復上傳?

回答

2

該文檔似乎落後於實際實施。幸運的是它是開源的,你可以簡單地閱讀源代碼來找到解決方案。 這是關於版本1.16-rc

如果上傳過程中發生IOException,則使用com.google.api.client.googleapis.media.MediaUploadErrorHandler來處理異常。此處理程序還負責恢復上載,但只有在HTTP-Request上註冊的另一個異常處理程序成功處理IOException時纔會這樣做。在當前版本的註釋表明這前提可能在將來改變:

// TODO(peleyal): figure out what is best practice - call serverErrorCallback only if I/O 
// exception was handled, or call it regardless 

由於默認IO異常處理程序爲null一個必須明確地設定。

的示例源代碼here初始化YouTube對象是這樣的::

youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(
      "youtube-cmdline-uploadvideo-sample").build(); 

爲了得到這個示例工作,修改行改爲:這可以建立YouTube -object時完成

youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {   
    @Override 
    public void initialize(HttpRequest request) throws IOException { 
    credential.initialize(request); 
    request.setIOExceptionHandler(new HttpBackOffIOExceptionHandler(new ExponentialBackOff())); 
    } 
}); 

每構建一個HTTPRequest並調用IOExceptionHandler,就會調用HTTPRequestInitializer。從那裏的MediaUploadErrorHandler將首先通過例外HttpBackOffIOExceptionHandler這可能會睡一會兒,然後再允許重試。之後,MediaUploadErrorHandler將嘗試繼續上傳。

請注意,credential也是HttpRequestInitializer,您需要同時執行兩個初始化程序。因此在我的例子中,在我添加的初始化程序中調用了credential

+0

謝謝 - 這已經比我目前找到的好多了!然而,這不是完整的「可恢復」上傳。應用程序重新啓動後,API仍然無法恢復。 –