问题描述
我正在开发一个将PDF文件上传到特定Google云端硬盘文件夹的应用。文件名包括当前日期。以下代码适用于我的DriveServiceHelper.class,该代码用于在Google云端硬盘中创建文件夹,然后使用其folderID将PDF文件上传到该文件夹:
public class DriveServiceHelper {
Calendar c = Calendar.getInstance();
Date d = c.getTime();
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
String currentDate = df.format(d);
String ps_FolderKey;
private final Executor mExecutor = Executors.newSingleThreadExecutor();
private Drive mDriveService;
public DriveServiceHelper(Drive mDriveService) {
this.mDriveService = mDriveService;
}
public Task<String> createFolder() {
return Tasks.call(mExecutor,() -> {
File folderMetadata = new File();
folderMetadata.setName("Covid Assessment Sheets");
folderMetadata.setMimeType("application/vnd.google-apps.folder");
File myFolder = null;
try {
myFolder = mDriveService.files().create(folderMetadata)
.setFields("id")
.execute();
System.out.println("Folder ID: " + myFolder.getId());
} catch (Exception e) {
e.printstacktrace();
}
if (myFolder == null) {
throw new IOException("Null result when requesting file creation");
}
ps_FolderKey = myFolder.getId();
return ps_FolderKey;
});
}
public Task<String> createFilePDF(String filePath,String folderId) {
return Tasks.call(mExecutor,() -> {
File fileMetaData = new File();
fileMetaData.setName("Covid Assessment @ " + currentDate);
fileMetaData.setParents(Collections.singletonList(folderId));
java.io.File file = new java.io.File(filePath);
FileContent mediaContent = new FileContent("application/pdf",file);
File myFile = null;
try {
myFile = mDriveService.files().create(fileMetaData,mediaContent).execute();
} catch (Exception e) {
e.printstacktrace();
}
if (myFile == null) {
throw new IOException("Null result when requesting file creation");
}
return myFile.getId();
});
}
}
将相同的PDF上传到Google云端硬盘文件夹时,我想覆盖具有相同名称的文件,但是即使文件名相同,由于分配的fileID不同,也会在该文件夹中创建重复文件。
请帮助我了解如何解决此问题,以自动覆盖/替换已经存在的具有相同名称的文件(每个文件均按日期区分),如果PDF文件不存在,则会创建一个新的PDF文件在文件夹中。
我知道我可能正在使用不赞成使用的Drive API,但无法在线找到其他解决方案来帮助我实现所需的解决方案。我还遇到了一些解决方案,其中包括用于搜索现有Google云端硬盘文件的查询,但是我不确定我是否知道如何使用它来使它对我有用。
谢谢
解决方法
Google云端硬盘支持多个具有相同名称的文件
因此,通过使用已经存在的名称创建文件,您将不会自动覆盖旧文件。
相反,您应该执行以下操作:
- 将方法Files:list与query
name = 'Covid Assessment Sheets'
一起使用,以查找已经存在的具有相同名称的文件 - 如果需要,您还可以通过指定
mimeType
和父文件夹(parents
)来缩小结果的范围 - 获取列表结果的
id
- 使用方法Files:delete删除现有文件
- 继续创建新文件
在Java中,外观如下:
FileList result = DriveService.files().list()
.setQ("name = 'Covid Assessment Sheets'");
.setFields("files(id)")
.execute();
List<File> files = result.getFiles();
for (File file : files) {
DriveService.files().delete(file.getId()).execute();
}
另一种方法是更新现有文件的内容,而不是创建一个新文件。