任意のファイルのアップロードを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バイトのファイルをアップロードしてから実際のファイルで更新)にあるという疑いがありますが、なぜ動作しないのかわかりません。
助けてください?
ありがとうございましたが、これは私の質問に答えていません。はい、アップロードは「一度に」実行されます。私は現時点でこれを使用することができません。私は、ドキュメントIDを取得するエントリを作成し、コードの後の別の場所でIDでこのエントリを検索し、実際のコンテンツをアップロードする必要があります。元の質問で説明しようとしたプロセスの「最初のステップ」は、あなたが提示したコードと事実上同じですが、「第2のステップ」に問題があります。 – techtime
更新については、新しいものをインスタンス化する代わりに、APIから取得したDocumentListEntryを使用して、RequestType.UPDATEを要求タイプとして使用できます。 – Alain
ええと、オリジナルの質問を読んで見て、コードスニペットを見直しましたか?私はAPIからエントリを取得しており、リクエストタイプとしてUPDATEを使用しています。 "UNAUTHORIZED"レスポンスで失敗します。 – techtime