答案:
很遗憾,使用URL中的文件名无法从Google Drive下载文件。
原因:
如下图所示,Google Drive支持多个具有相同名称的文件。每个文件都有一个唯一的ID来区分其他文件,而非仅通过文件名进行标识。例如,可能会有三个完全相同名称的文件,如果您只参考文件名进行请求,则不足以提供足够的信息来确定 确切要下载的文件。
![enter image description here](https://istack.dev59.com/erKKb.webp)
解决方法:
您仍然可以使用文件名构建请求,但首先需要向Drive API发出列表请求,以便获取要下载的特定文件的文件ID。
假设您要下载的文件名为fileName.json
,则需要首先向服务器发出列表请求以获取初始文件名。此操作所需的范围是:
https://www.googleapis.com/auth/drive.readonly
请求本身就像您在问题中提出的那样。一旦您获得了令牌,您必须发出GET请求:
GET https://www.googleapis.com/drive/v3/files?q=name+%3D+'fileName.json'&key=[YOUR API KEY]
您必须使用实际的API密钥替换[YOUR API KEY]
。您可以在OAuth Playground上获得临时密钥。
从此请求中,您将获得一个JSON响应,其中包含请求文件名的所有驱动器中的文件。这是一个重要的问题 - 如果只有一个文件具有此文件名,则无需担心,可以继续进行。如果存在多个文件,则JSON响应将包含所有这些文件,因此需要添加额外的代码来检索所需的文件。
接下来 - 您收到的响应形式如下:
{
"incompleteSearch": false,
"files": [
{
"mimeType": "application/json",
"kind": "drive#file",
"id": "<your-file-ID>",
"name": "fileName.json"
}
],
"kind": "drive#fileList"
}
从这里开始,您可以开始构建您的URL。
构建下载URL:
从API中检索JSON响应后,您需要提取文件ID并放入URL中。以下示例是用JavaScript / Google Apps Script编写的,但可以使用适合您需求的任何语言构建:
function buildTheUrl() {
var url = "https://www.googleapis.com/drive/v3/files";
var fileName = "fileName.json"
var apiKey = "your-api-key";
var parameters = "?q=name+%3D+'";
var requestUrl = url + parameters + fileName + "&key=" + apiKey;
var response = JSON.parse(UrlFetchApp.fetch(requestUrl).getContentText());
var fileId = response.files.id;
var downloadUrl = "https://www.googleapis.com/drive/v3/files/";
var urlParams = "?alt=media";
return downloadUrl + fileId + urlParams + "&key=" + apiKey;
}
此代码会返回一个字符串,其中包含文件的下载链接。这是一个
Files: get
请求,您可以使用它来下载所需的文件。
参考资料: