2012-04-14 12 views
2

任意のファイルのアップロードをGoogle Docsに既存のアプリケーションに統合しようとしています。これは、再開可能なアップロードを使用する前に動作するために使用されました。私はJavaクライアントライブラリを使用しています。Google API再開可能アップデートから401を取得する

アプリケーションは2つの段階でアップロードを行っている: - ファイル のRESOURCEIDを取得 - データ

Iが0サイズのファイルをアップロードしていますRESOURCEIDを取得するためにアップロードする(すなわちのContent-Length = 0 )。再開可能なURL(つまりhttps://docs.google.com/feeds/upload/create-session/default/private/full?convert=false)に?convert = falseを渡しています。

"application/octet-stream"をcontent-typeとして渡しています。これはうまくいくようですが、画像のようなものでは "file:..." resourceIdが、PDFの場合は "pdf:...." resourceIdsという別のresourcesIdsがあります。

第2ステップでは、以前に取得したresourceIdに基づいてURLを構成し、検索(getEntry)を実行します。 URLはhttps://docs.google.com/feeds/default/private/full/file%3A .....

という形式です。エントリが見つかると、ResumableGDataFileUploaderを使用して、アップロードするファイルの実際のデータでコンテンツ(0バイトのファイル)を更新します。この操作は、ResumableGDataFileUploaderインスタンスを構築するときに401 Unauthorizedレスポンスで失敗します。

?convert = falseと同様に?new-revision = trueとこれらの両方を同時に試しました。結果は同じです。

コードの関連部分は:

MediaFileSource mediaFile = new MediaFileSource(
    tempFile, "application/octet-stream"); 

final ResumableGDataFileUploader.Builder builder = 
    new ResumableGDataFileUploader.Builder(client, mediaFile, documentListEntry); 
builder.executor(MoreExecutors.sameThreadExecutor()); 
builder.requestType(ResumableGDataFileUploader.RequestType.UPDATE); 

// This is where it fails 
final ResumableGDataFileUploader resumableGDataFileUploader = builder.build(); 
resumableGDataFileUploader.start(); 

return tempFile.length(); 

「クライアント」のOAuthを使用するように構成さDocsServiceのインスタンスです。与えられたコードの直前に "documentListEntry"を見つけるために使われます。

クライアントライブラリのコードに「既存のエントリを更新する」というNullPointerExceptionの原因となるバグが含まれていると思われるため、リクエストタイプを明示的に指定する必要がありました。

問題は具体的にはアクションのシーケンス(resourceIdを取得するために0バイトのファイルをアップロードしてから実際のファイルで更新)にあるという疑いがありますが、なぜ動作しないのかわかりません。

助けてください?

答えて

3

このコードスニペットは、OAuthの1.0とOAuth 2.0の使用して私の作品:

static void uploadDocument(DocsService client) throws IOException, ServiceException, 
    InterruptedException { 
    ExecutorService executor = Executors.newFixedThreadPool(10); 

    File file = new File("<PATH/TO/FILE>"); 
    String mimeType = DocumentListEntry.MediaType.fromFileName(file.getName()).getMimeType(); 

    DocumentListEntry documentEntry = new DocumentListEntry(); 
    documentEntry.setTitle(new PlainTextConstruct("<DOCUMENT TITLE>")); 

    int DEFAULT_CHUNK_SIZE = 2 * 512 * 1024; 
    ResumableGDataFileUploader.Builder builder = 
     new ResumableGDataFileUploader.Builder(
      client, 
      new URL(
       "https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false"), 
      new MediaFileSource(file, mimeType), documentEntry).title(file.getName()) 
      .requestType(RequestType.INSERT).chunkSize(DEFAULT_CHUNK_SIZE).executor(executor); 

    ResumableGDataFileUploader uploader = builder.build(); 
    Future<ResponseMessage> msg = uploader.start(); 
    while (!uploader.isDone()) { 
    try { 
     Thread.sleep(100); 
    } catch (InterruptedException ie) { 
     throw ie; // rethrow 
    } 
    } 

    DocumentListEntry uploadedEntry = uploader.getResponse(DocumentListEntry.class); 
    // Print the document's ID. 
    System.out.println(uploadedEntry.getId()); 
    System.out.println("Upload is done!"); 
} 
+0

ありがとうございましたが、これは私の質問に答えていません。はい、アップロードは「一度に」実行されます。私は現時点でこれを使用することができません。私は、ドキュメントIDを取得するエントリを作成し、コードの後の別の場所でIDでこのエントリを検索し、実際のコンテンツをアップロードする必要があります。元の質問で説明しようとしたプロセスの「最初のステップ」は、あなたが提示したコードと事実上同じですが、「第2のステップ」に問題があります。 – techtime

+0

更新については、新しいものをインスタンス化する代わりに、APIから取得したDocumentListEntryを使用して、RequestType.UPDATEを要求タイプとして使用できます。 – Alain

+1

ええと、オリジナルの質問を読んで見て、コードスニペットを見直しましたか?私はAPIからエントリを取得しており、リクエストタイプとしてUPDATEを使用しています。 "UNAUTHORIZED"レスポンスで失敗します。 – techtime

関連する問題