【发布时间】:2012-04-14 13:12:28
【问题描述】:
我正在尝试将上传到 Google Docs 的任意文件集成到现有应用程序中。在强制使用可恢复上传之前,这曾经有效。我正在使用 Java 客户端库。
应用程序分两步进行上传: - 获取文件的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”作为内容类型传递。这似乎可行,尽管我确实得到了不同的资源 ID - “文件:...”资源 ID 用于图像之类的东西,但“pdf:....”资源 ID 用于 PDF。
第二步根据之前获取的resourceId构造一个URL,并进行搜索(getEntry)。 URL 格式为https://docs.google.com/feeds/default/private/full/file%3A.....
找到条目后,ResumableGDataFileUploader 将使用正在上传的文件中的实际数据更新内容(0 字节文件)。构建 ResumableGDataFileUploader 实例时,此操作失败并返回 401 Unauthorized response。
我已经尝试过 ?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();
“客户端”是 DocsService 的一个实例,配置为使用 OAuth。它用于在给定代码段之前查找“documentListEntry”。
我必须明确指定请求类型,因为客户端库代码似乎包含一个错误,导致“更新现有条目”情况下出现 NullPointerException。
我怀疑问题出在操作序列上(上传 0 字节文件以获取 resourceId,然后使用实际文件进行更新),但我不知道为什么它不起作用。
请帮忙?
【问题讨论】:
标签: google-docs-api