Google ドキュメントへの任意のファイルのアップロードを既存のアプリケーションに統合しようとしています。これは、再開可能なアップロードの使用が必須になる前に機能していました。Java クライアント ライブラリを使用しています。
アプリケーションは 2 つのステップでアップロードを実行します: - ファイルの resourceId を取得します - データをアップロードします
resourceId を取得するために、サイズが 0 のファイル (つまり、Content-Length=0) をアップロードしています。再開可能な URL に ?convert=false を渡しています (つまり、https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false )。
「application/octet-stream」を content-type として渡しています。これは機能しているようですが、画像などの場合は「file:...」リソースID、PDFの場合は「pdf:....」リソースIDという異なるリソースIDを取得します。
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 を引き起こすバグが含まれているように見えるため、リクエスト タイプを明示的に指定する必要がありました。
問題は具体的には一連のアクション (0 バイトのファイルをアップロードして resourceId を取得し、実際のファイルで更新する) にあるのではないかと疑っていますが、なぜ機能しないのかわかりません。
助けてください?