当我尝试通过 Google Drive 上的 getFileSize() 获取文件大小时,结果为 null。我知道,当文件未存储在 Drive 上但文件存储在 Drive 上时,结果可能为 null(downloadUrl 与 null 不同)。
Drive lService = new Builder(new NetHttpTransport(), new JacksonFactory(), lCredential).setApplicationName("TODO").build();
FileList files = lService.files().list().execute();
List<FileDTO> lResult = new ArrayList<FileDTO>();
for (File lFile : files.getItems()) {
DriveFileDTO lFileDTO = new DriveFileDTO();
lFileDTO.setName(lFile.getTitle());
lFileDTO.setMimeType(lFile.getMimeType());
lFileDTO.setSize(lFile.getFileSize()); // <-- FileSize = NULL
lFileDTO.setUrl(lFile.getDownloadUrl());
lResult.add(lFileDTO);
}
你能帮我吗?
谢谢! 开始!
Google 云端硬盘对文件列表的默认请求将包括文件大小,但仅限于文件大小不隐式为空的文件。例如,文件夹和 Google 电子表格(只是链接)将为空。
这可以通过 Drive API exlporer 进行验证。只需在字段编辑器中请求文件大小和 mimtype 即可。即使请求了文件大小,键值对也不会包含在所提到的文件类型的响应中——但会返回其他类型的键值对。
请尝试使用 OAuth 2.0 Playground 重现问题:
https://developers.google.com/oauthplayground
通过使用 OAuth Playground,我们可以发送原始请求并检查 API 中是否存在问题。 我尝试自己复制它并且工作正常。
我还面临着从 Google Drive API 获取文件大小的问题。 但后来我找到了解决方案。 在请求中添加“.setFields("nextPageToken, files(id, name,createdTime,modifiedTime,size,kind)")”字段。 您需要在此处列出您要访问的字段。
FileList result = mDrive
.files()
.list()
.setQ("parents = 'MY_FODER'")
.setSpaces("drive")
.setFields("nextPageToken, files(id, name, createdTime, modifiedTime, size, kind)")
.execute();
此外,在创建云端硬盘时,添加范围“https://www.googleapis.com/auth/drive.metadata.readonly”
GoogleAccountCredential credential =
GoogleAccountCredential.usingOAuth2(
mContext,
Arrays.asList(
"https://www.googleapis.com/auth/drive.readonly",
"https://www.googleapis.com/auth/drive.metadata.readonly",
Scopes.EMAIL));
credential.setSelectedAccount(mAccount.getAccount());
mDrive = new Drive.Builder(
AndroidHttp.newCompatibleTransport(),
new GsonFactory(),
credential)
.setApplicationName("Android-client")
.build();
在 HttpResponse 类上调用
getHeaders().GetContentLength()
(代码假设 myurl
是您的 url):
HttpResponse resp = service.getRequestFactory().buildGetRequest(new GenericUrl(myurl)).execute();
Log.v("abc","file size is : " + resp.getHeaders().getContentLength());