我正在尝试使用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);
似乎这不是标题,毕竟是主要问题。如果我只是想弄清楚如何将文件数据添加到空文件中,我应该完成。
添加: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让我走上正轨。
答案 0 :(得分:0)
将其编码为UTF-8,或将uploadType更改为“media”。