2

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 を取得し、実際のファイルで更新する) にあるのではないかと疑っていますが、なぜ機能しないのかわかりません。

助けてください?

4

1 に答える 1

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!");
}
于 2012-04-17T17:01:55.370 に答える