使用Google Drive V2客户端库无法获取部分文件的fileSize问题求助
解决Google Drive V2客户端库获取docx文件大小返回null的问题
问题情况
- 使用Google Drive V2客户端库调用
files().get()接口获取文件大小,部分包含内容的docx文件返回fileSize为null - 这类文件的共性是被Google Docs打开编辑过,且在Drive网页UI中也无法查看文件大小
原因分析
当docx文件通过Google Docs打开后,Drive会自动创建关联的Google Docs云端版本,原文件的元数据字段fileSize会被清空——此时Drive优先关联云端编辑版本,原文件的大小信息不再被主动维护,导致接口和UI都无法获取到该值。
解决方案
方案1:通过媒体流获取原文件大小(V2可用)
直接请求文件的媒体内容流,通过读取流的实际大小来获取文件尺寸,不受元数据影响:
Drive service = new Drive.Builder(httpTransport, jsonFactory, httpRequestInitializer).build(); // 获取文件媒体流 InputStream inputStream = service.files().get(fileId).executeMediaAsInputStream(); // 读取流并计算大小 ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int readLength; while ((readLength = inputStream.read(buffer)) != -1) { byteStream.write(buffer, 0, readLength); } Long fileSize = (long) byteStream.size(); // 关闭流资源 inputStream.close(); byteStream.close();
方案2:迁移到Google Drive V3客户端库
Drive V3对转换后文件的元数据处理更完善,字段名从fileSize改为size,且需要明确指定要获取的字段:
Drive service = new Drive.Builder(httpTransport, jsonFactory, httpRequestInitializer) .setApplicationName("你的应用名称") .build(); // 指定获取size字段 com.google.api.services.drive.v3.model.File file = service.files().get(fileId) .setFields("size") .execute(); Long fileSize = file.getSize();
V3会自动关联原文件的大小信息,无需额外处理流。
注意事项
- 方案1需要注意流资源的关闭,避免内存泄漏;如果是大文件,建议写入临时文件后再获取文件大小,避免占用过多内存
- 若必须使用V2版本,优先选择方案1,这是最可靠的方式
内容的提问来源于stack exchange,提问作者Adharsha Neel
相关产品推荐
相关产品推荐

