使用Google Drive API上传文件会返回“400:错误请求”

时间:2013-06-28 12:02:52

标签: java google-api google-drive-api google-api-java-client

我正在尝试使用Google Drive API和Java将文件上传到Google云端硬盘。

我要上传的文件是docx文件(之前使用Drive API导出)。我的问题是,在上传包含瑞典字符(如åäö)的文件名的文件时,Drive API会抛出异常。

上传代码看起来基本上是这样的:

File file = new File("/path/to/file.docx");
String contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

File fileToUpload = new File()
            .setTitle("abc")
            .setMimeType(contentType);

FileContent mediaContent = new FileContent(contentType, file);

try {
    Drive.Files.Insert request = client.files().insert(fileToUpload, mediaContent);
    request.execute();
} catch (IOException e) {
    logger.error("Could not restore file");
    throw e;
}

这段代码实际上运行正常。 如果我将setTitle(“abc”)更改为setTitle(“abcö”),我会得到以下异常:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
Bad Request

我尝试使用google-api-services-drive的版本v2-rev82-1.14.2-beta和v2-rev82-1.15.0-rc,结果相同。

如果有帮助,我正在使用OSX(Windows似乎更经常出现这些问题)。


编辑: 经过一些实验,我发现如果我排除FileContent对象(实际的文件内容),并且只创建一个上传元数据的空文件,那么标题中的瑞典字符就可以了。

Drive.Files.Insert request = client.files().insert(fileToUpload);

似乎这不是标题,毕竟是主要问题。如果我只是想弄清楚如何将文件数据添加到空文件中,我应该完成。


EDIT2:找到解决方案!

添加:request.getMediaHttpUploader().setDirectUploadEnabled(true);可以直接上传(不知道我之前使用的是什么),显然这使得Google云端硬盘不再关心我的瑞典字符(再次,不知道为什么)。

这是我最终得到的代码(简化):

File file = new File("/path/to/file.docx");
String contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";

File fileToUpload = new File()
        .setTitle("abcö")
        .setMimeType(contentType);

FileContent mediaContent = new FileContent(contentType, file);

try {
    Drive.Files.Insert request = client.files().insert(fileToUpload, mediaContent);
    request.getMediaHttpUploader().setDirectUploadEnabled(true);
    request.execute();
} catch (IOException e) {
    logger.error("Could not restore file");
    throw e;
}

现在我只需要为大文件添加对可恢复上传的支持,但这是另一回事。

EDIT3:顺便说一句,here are the docs让我走上正轨。

1 个答案:

答案 0 :(得分:0)

将其编码为UTF-8,或将uploadType更改为“media”。