คู่มือนี้อธิบายวิธีที่ Google Drive API รองรับการค้นหาไฟล์และโฟลเดอร์หลายวิธี
คุณสามารถใช้ list วิธีใน
files ทรัพยากรเพื่อแสดงผลไฟล์และโฟลเดอร์ทั้งหมดหรือบางส่วนของผู้ใช้
ไดรฟ์ นอกจากนี้ คุณยังใช้วิธี list
เพื่อดึงข้อมูล fileId ที่จำเป็นสำหรับวิธีการของทรัพยากรบางอย่าง (เช่น วิธี
get และ update) ได้ด้วย
ใช้พารามิเตอร์ fields
หากต้องการระบุช่องที่จะแสดงผลในการตอบกลับ คุณสามารถตั้งค่า
fields พารามิเตอร์
ระบบ
ด้วยวิธีใดก็ได้ของทรัพยากร files หากไม่ใส่พารามิเตอร์ fields เซิร์ฟเวอร์จะแสดงผลชุดช่องเริ่มต้นที่เฉพาะเจาะจงกับวิธีนั้นๆ เช่น วิธี
list จะแสดงผลเฉพาะช่อง kind, id,
name, mimeType, และ resourceKey สำหรับแต่ละไฟล์ หากต้องการแสดงผลช่องอื่นๆ
โปรดดูหัวข้อแสดงผลช่องที่เฉพาะเจาะจง
รับไฟล์ตามรหัส
หากต้องการรับไฟล์ ให้ใช้วิธี get ในทรัพยากร
files พร้อมพารามิเตอร์เส้นทาง fileId
หากไม่ทราบรหัสไฟล์ คุณสามารถ แสดงไฟล์ทั้งหมด โดยใช้ list
วิธี
วิธีนี้จะแสดงผลไฟล์เป็นอินสแตนซ์ของทรัพยากร files หากระบุพารามิเตอร์ alt=media การตอบกลับจะมีเนื้อหาของไฟล์ในเนื้อหาการตอบกลับ หากต้องการดาวน์โหลดไฟล์ Blob โปรดดูหัวข้อดาวน์โหลดเนื้อหาไฟล์ Blob
หากต้องการรับทราบความเสี่ยงในการดาวน์โหลดมัลแวร์ที่ทราบหรือไฟล์ที่เป็น
อันตรายอื่นๆ ให้ตั้งค่าพารามิเตอร์การค้นหา
acknowledgeAbuse เป็น true ช่องนี้ใช้ได้เฉพาะเมื่อตั้งค่าพารามิเตอร์ alt=media และผู้ใช้เป็นเจ้าของไฟล์หรือผู้จัดระเบียบของไดรฟ์ที่แชร์ซึ่งไฟล์นั้นอยู่
แสดงไฟล์และโฟลเดอร์ทั้งหมดในไดรฟ์ของฉัน
ใช้วิธี list โดยไม่มีพารามิเตอร์ใดๆ เพื่อแสดงผลไฟล์และโฟลเดอร์ทั้งหมดในไดรฟ์ของฉันของผู้ใช้ปัจจุบัน
คำสั่ง curl ต่อไปนี้แสดงวิธีแสดงไฟล์ทั้งหมด
curl -X GET \
'https://www.googleapis.com/drive/v3/files' \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Accept: application/json'
แทนที่ ACCESS_TOKEN ด้วยโทเค็นเพื่อการเข้าถึง OAuth 2.0 ที่ได้รับอนุญาต
ค้นหาไฟล์และโฟลเดอร์ที่เฉพาะเจาะจงในไดรฟ์ของฉัน
หากต้องการค้นหาชุดไฟล์หรือโฟลเดอร์ที่เฉพาะเจาะจงในไดรฟ์ของฉันของผู้ใช้ปัจจุบัน ให้ใช้ช่องสตริงการค้นหา q กับวิธี list เพื่อกรองไฟล์ที่จะแสดงผลโดยรวมข้อความค้นหาอย่างน้อย 1 รายการ
ไวยากรณ์สตริงการค้นหามี 3 ส่วนต่อไปนี้
query_term operator values
โดยที่
query_termคือข้อความค้นหาหรือช่องที่จะค้นหาoperatorระบุเงื่อนไขสำหรับข้อความค้นหาvaluesคือค่าที่เฉพาะเจาะจงที่คุณต้องการใช้เพื่อกรองผลการค้นหา
ตัวอย่างเช่น สตริงการค้นหาต่อไปนี้จะกรองการค้นหาเพื่อแสดงผลเฉพาะ โฟลเดอร์โดยการตั้งค่า ประเภท MIME:
mimeType = 'application/vnd.google-apps.folder'
หากต้องการดูข้อความค้นหาไฟล์ทั้งหมด โปรดดู ข้อความค้นหาที่เฉพาะเจาะจงกับไฟล์
หากต้องการดูโอเปอเรเตอร์การค้นหาทั้งหมดที่คุณใช้เพื่อสร้างการค้นหาได้ โปรดดูโอเปอเรเตอร์ การค้นหา
ตัวอย่างสตริงการค้นหา
ตารางต่อไปนี้แสดงตัวอย่างสตริงการค้นหาพื้นฐานบางรายการ โค้ดจริงจะแตกต่างกันไปตามไลบรารีของไคลเอ็นต์ที่คุณใช้สำหรับการค้นหา
นอกจากนี้ คุณต้องหลีกเลี่ยงการใช้อักขระพิเศษในชื่อไฟล์เพื่อให้การค้นหาทำงานได้อย่างถูกต้อง ตัวอย่างเช่น หากชื่อไฟล์มีทั้งอักขระอะพอสทรอฟี
(') และแบ็กสแลช ("\") ให้ใช้แบ็กสแลชเพื่อหลีกเลี่ยงการใช้อักขระเหล่านั้น: name
contains 'quinn\'s paper\\essay'.
| สิ่งที่ต้องการค้นหา | ตัวอย่าง |
|---|---|
โอเปอเรเตอร์การจับคู่สตริง (contains) |
|
| ไฟล์ที่มีคำว่า "hello" | fullText contains 'hello' |
| ไฟล์ที่มีวลี "hello world" ที่ตรงกันทุกประการ | fullText contains '"hello world"' |
| ไฟล์ที่มีการค้นหาที่มีอักขระ "\" (เช่น "\authors") | fullText contains '\\authors' |
| ไฟล์ที่มีชื่อซึ่งมีคำว่า "budget" | name contains 'budget' |
โอเปอเรเตอร์ความเท่ากันและความไม่เท่ากัน (=, !=) |
|
| ไฟล์ที่มีชื่อว่า "hello" | name = 'hello' |
| ไฟล์ที่เป็นโฟลเดอร์ | mimeType = 'application/vnd.google-apps.folder' |
| ไฟล์ที่ไม่ใช่โฟลเดอร์ | mimeType != 'application/vnd.google-apps.folder' |
| ไฟล์ที่ติดดาว | starred = true |
| ไฟล์ที่อยู่ในถังขยะ | trashed = true |
| ไฟล์ที่ไม่อยู่ในถังขยะ | trashed = false |
| ทางลัดที่ชี้ไปยังรหัสไฟล์ที่เฉพาะเจาะจง | shortcutDetails.targetId = '1987654321' |
| ไฟล์ที่ไม่ได้แชร์กับบุคคลหรือโดเมนใดๆ (ส่วนตัว หรือแชร์กับผู้ใช้หรือกลุ่มที่เฉพาะเจาะจง) | visibility = 'limited' |
| ไฟล์ที่ทุกคนที่มีลิงก์เข้าถึงได้ | visibility = 'anyoneWithLink' |
| ไฟล์ที่ค้นพบได้แบบสาธารณะบนเว็บ | visibility = 'anyoneCanFind' |
โอเปอเรเตอร์การเปรียบเทียบ (>, >=, <, <=) |
|
| ไฟล์ที่แก้ไขหลังจากวันที่ที่กำหนด (เขตเวลาเริ่มต้นคือ UTC) | modifiedTime > '2012-06-04T12:00:00' |
| ไฟล์ที่สร้างหลังจากวันที่ 1 มกราคม 2023 | createdTime > '2023-01-01T00:00:00' |
| ไฟล์ที่แก้ไขก่อนวันที่ 1 มกราคม 2023 | modifiedTime < '2023-01-01T00:00:00' |
โอเปอเรเตอร์การเป็นสมาชิกคอลเล็กชัน (in) |
|
ไฟล์ย่อยโดยตรงภายในคอลเล็กชัน (เช่น รหัสโฟลเดอร์ในคอลเล็กชัน parents) |
'1234567' in parents |
| ไฟล์ในโฟลเดอร์ข้อมูลแอปพลิเคชัน | 'appDataFolder' in parents |
| ไฟล์ที่ผู้ใช้ "test@example.org" เป็นเจ้าของ | 'test@example.org' in owners |
| ไฟล์ที่ผู้ใช้ "test@example.org" มีสิทธิ์เขียน | 'test@example.org' in writers |
| ไฟล์ที่สมาชิกของกลุ่ม "group@example.org" มีสิทธิ์เขียน | 'group@example.org' in writers |
| ไฟล์ที่ผู้ใช้ "test@example.org" มีสิทธิ์อ่าน | 'test@example.org' in readers |
โอเปอเรเตอร์การจับคู่คอลเล็กชัน (has) |
|
| ไฟล์ที่มีพร็อพเพอร์ตี้ไฟล์ที่กำหนดเองซึ่งแอปทั้งหมดมองเห็นได้ | properties has { key='mass' and value='1.3kg' } |
| ไฟล์ที่มีพร็อพเพอร์ตี้ไฟล์ที่กำหนดเองซึ่งแอปที่ส่งคำขอเท่านั้นที่มองเห็นได้ | appProperties has { key='additionalID' and value='8e8aceg2af2ge72e78' } |
| ไฟล์ที่มีพร็อพเพอร์ตี้ไฟล์ที่กำหนดเองซึ่งมีคีย์ "department" (ไม่ว่าจะมีค่าใดก็ตาม) | properties has { key='department' } |
โอเปอเรเตอร์ตรรกะ (and, or, not) |
|
| ไฟล์ที่มีชื่อซึ่งมีคำว่า "hello" และ "goodbye" | name contains 'hello' and name contains 'goodbye' |
| ไฟล์ที่มีชื่อซึ่งไม่มีคำว่า "hello" | not name contains 'hello' |
| ไฟล์ที่มีข้อความ "important" และอยู่ในถังขยะ | fullText contains 'important' and trashed = true |
| ไฟล์ที่ไม่มีคำว่า "hello" | not fullText contains 'hello' |
| ไฟล์รูปภาพหรือวิดีโอที่แก้ไขหลังจากวันที่ที่กำหนด | modifiedTime > '2012-06-04T12:00:00' and (mimeType contains 'image/' or mimeType contains 'video/') |
| ไฟล์ที่แชร์กับผู้ใช้ที่ได้รับอนุญาตซึ่งมีคำว่า "hello" ในชื่อ | sharedWithMe and name contains 'hello' |
| ไฟล์ที่เป็นโฟลเดอร์หรือทางลัด | mimeType = 'application/vnd.google-apps.folder' or mimeType = 'application/vnd.google-apps.shortcut' |
| ไฟล์ที่มีชื่อว่า "Project Plan" ซึ่งไม่อยู่ในถังขยะ | name = 'Project Plan' and trashed = false |
| ไฟล์ย่อยโดยตรงในโฟลเดอร์ที่เฉพาะเจาะจงซึ่งไม่อยู่ในถังขยะ | '1234567' in parents and trashed = false |
กรองผลการค้นหาด้วยไลบรารีของไคลเอ็นต์
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีใช้ไลบรารีของไคลเอ็นต์เพื่อกรองผลการค้นหาให้แสดงเฉพาะชื่อไฟล์และรหัสของไฟล์ JPEG ตัวอย่างนี้ใช้ข้อความค้นหา mimeType เพื่อจำกัดผลการค้นหาให้แสดงเฉพาะไฟล์ประเภท image/jpeg นอกจากนี้ ยังตั้งค่า
spaces เป็น drive เพื่อจำกัดการค้นหาให้แสดงเฉพาะพื้นที่ไดรฟ์ เมื่อ nextPageToken แสดงผล null แสดงว่าไม่มีผลการค้นหาเพิ่มเติม
Java
Python
Node.js
PHP
แสดงไฟล์ในโฟลเดอร์สาธารณะ
หากต้องการค้นหาหรือแสดงไฟล์ในโฟลเดอร์ที่แชร์แบบสาธารณะ (โดยตั้งค่าการเข้าถึงเป็น
"ทุกคนที่มีลิงก์" หรือ "สาธารณะบนเว็บ") ให้ใช้วิธี list ในทรัพยากร files โดยตั้งค่าพารามิเตอร์การค้นหา q query
เพื่อกรองตามรหัสของโฟลเดอร์ในคอลเล็กชัน parents ดังนี้
'FOLDER_ID' in parents and trashed = false
เมื่อแสดงไฟล์ในโฟลเดอร์สาธารณะ คุณสามารถตรวจสอบสิทธิ์คำขอโดยใช้
คีย์ API แทนข้อมูลเข้าสู่ระบบผู้ใช้ OAuth 2.0
ได้ หากโฟลเดอร์อยู่ในไดรฟ์ที่แชร์ คุณต้องตั้งค่า supportsAllDrives=true และ includeItemsFromAllDrives=true ในคำขอด้วย
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีแสดงไฟล์ในโฟลเดอร์สาธารณะ
Node.js
/**
* List files in a public folder using an API key.
* @param {string} folderId The ID of the public folder.
* @param {string} apiKey Your Google Cloud API key.
* @return {Promise<Array>} The list of files.
*/
async function listPublicFolder(folderId, apiKey) {
const {google} = require('googleapis');
const service = google.drive({version: 'v3', auth: apiKey});
try {
const response = await service.files.list({
q: `'${folderId}' in parents and trashed = false`,
fields: 'nextPageToken, files(id, name, mimeType)',
supportsAllDrives: true,
includeItemsFromAllDrives: true,
});
const files = response.data.files;
console.log('Files:');
for (const file of files) {
console.log(`${file.name} (${file.id})`);
}
return files;
} catch (err) {
// TODO(developer): Handle error
console.error(err);
}
}
curl
curl -G \
'https://www.googleapis.com/drive/v3/files' \
--data-urlencode "q='FOLDER_ID' in parents and trashed = false" \
--data-urlencode 'supportsAllDrives=true' \
--data-urlencode 'includeItemsFromAllDrives=true' \
--data-urlencode 'fields=nextPageToken,files(id,name,mimeType)' \
--data-urlencode 'key=API_KEY' \
-H 'Accept: application/json'
แทนที่ค่าต่อไปนี้
- FOLDER_ID: รหัสของโฟลเดอร์สาธารณะ
- API_KEY: คีย์ API ของโปรเจ็กต์
ค้นหาโฟลเดอร์และไฟล์ที่สืบทอดแบบเรียกซ้ำ
ข้อความค้นหา parents จะแสดงผลเฉพาะไฟล์และโฟลเดอร์ย่อยโดยตรงที่อยู่ในโฟลเดอร์ที่ระบุ Drive API ไม่มีโอเปอเรเตอร์การค้นหาหรือพารามิเตอร์สำหรับการค้นหาแบบเรียกซ้ำในโครงสร้างโฟลเดอร์ย่อยที่สืบทอดในการเรียก API ครั้งเดียว
หากต้องการค้นหาโฟลเดอร์และโฟลเดอร์ย่อยและไฟล์ที่สืบทอดทั้งหมด แอปพลิเคชันของคุณต้องทำการข้ามโครงสร้างแบบฝั่งไคลเอ็นต์ ดังนี้
- ค้นหาไฟล์ย่อยโดยตรงของโฟลเดอร์เป้าหมายโดยใช้
'FOLDER_ID' in parents and trashed = false - ระบุโฟลเดอร์ย่อยโดยกรองผลการค้นหาที่
mimeType = 'application/vnd.google-apps.folder' - ค้นหารหัสของโฟลเดอร์ย่อยแต่ละรายการแบบเรียกซ้ำหรือแบบวนซ้ำเพื่อดึงข้อมูลเนื้อหา
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีค้นหาโฟลเดอร์และโฟลเดอร์ย่อยแบบเรียกซ้ำ
Node.js
/**
* Recursively searches a folder and all descendant subfolders for files.
* @param {string} folderId The ID of the starting folder.
* @param {Object} authClient An authorized OAuth 2.0 client.
* @return {Promise<Array>} The list of all descendant files.
*/
async function searchFolderRecursively(folderId, authClient) {
const {google} = require('googleapis');
const service = google.drive({version: 'v3', auth: authClient});
const allFiles = [];
const foldersToSearch = [folderId];
try {
while (foldersToSearch.length > 0) {
const currentFolderId = foldersToSearch.pop();
let pageToken = null;
do {
const response = await service.files.list({
q: `'${currentFolderId}' in parents and trashed = false`,
fields: 'nextPageToken, files(id, name, mimeType)',
pageSize: 1000,
supportsAllDrives: true,
includeItemsFromAllDrives: true,
pageToken: pageToken,
});
const files = response.data.files || [];
for (const file of files) {
if (file.mimeType === 'application/vnd.google-apps.folder') {
foldersToSearch.push(file.id);
} else {
allFiles.push(file);
}
}
pageToken = response.data.nextPageToken;
} while (pageToken);
}
return allFiles;
} catch (err) {
// TODO(developer): Handle error
console.error(err);
throw err;
}
}
Python
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
def search_folder_recursively(folder_id, creds):
"""Recursively searches a folder and all descendant subfolders for
files.
Args:
folder_id: The ID of the starting folder.
creds: An authorized OAuth 2.0 credentials object.
Returns:
A list of all descendant file resources.
"""
service = build("drive", "v3", credentials=creds)
all_files = []
folders_to_search = [folder_id]
try:
while folders_to_search:
current_folder_id = folders_to_search.pop()
page_token = None
while True:
response = (
service.files()
.list(
q=f"'{current_folder_id}' in parents and trashed = false",
fields="nextPageToken, files(id, name, mimeType)",
pageSize=1000,
supportsAllDrives=True,
includeItemsFromAllDrives=True,
pageToken=page_token,
)
.execute()
)
for item in response.get("files", []):
if (
item.get("mimeType")
== "application/vnd.google-apps.folder"
):
folders_to_search.append(item.get("id"))
else:
all_files.append(item)
page_token = response.get("nextPageToken")
if not page_token:
break
return all_files
except HttpError as error:
# TODO(developer): Handle error
print(f"An error occurred: {error}")
return None
ค้นหาไฟล์ที่มีคุณสมบัติที่กำหนดเอง
หากต้องการค้นหาไฟล์ที่มีพร็อพเพอร์ตี้ไฟล์ที่กำหนดเอง ให้ใช้คำค้นหา properties หรือ appProperties พร้อมคีย์และค่า ตัวอย่างเช่น หากต้องการค้นหาพร็อพเพอร์ตี้ไฟล์ที่กำหนดเองซึ่งแอปที่ส่งคำขอเท่านั้นที่มองเห็นได้ ชื่อ additionalID และมีค่าเป็น 8e8aceg2af2ge72e78 ให้ใช้ข้อความค้นหาต่อไปนี้
appProperties has { key='additionalID' and value='8e8aceg2af2ge72e78' }
ดูข้อมูลเพิ่มเติมได้ที่หัวข้อ เพิ่มพร็อพเพอร์ตี้ไฟล์ที่กำหนดเอง
ค้นหาไฟล์ตามป้ายกำกับหรือค่าของช่อง
หากต้องการค้นหาไฟล์ที่มีป้ายกำกับที่เฉพาะเจาะจง ให้ใช้คำค้นหา labels พร้อมรหัสป้ายกำกับที่เฉพาะเจาะจง
หากต้องการค้นหาไฟล์ที่มีป้ายกำกับที่เฉพาะเจาะจง ให้ใช้ข้อความค้นหาต่อไปนี้
'labels/LABEL_ID' in labels
หากต้องการค้นหาไฟล์ที่ไม่มีป้ายกำกับที่เฉพาะเจาะจง ให้ใช้ข้อความค้นหาต่อไปนี้
not 'labels/LABEL_ID' in labels
หากต้องการค้นหาไฟล์ตามค่าของช่องป้ายกำกับที่เฉพาะเจาะจง ให้ใช้ข้อความค้นหาต่อไปนี้
labels/LABEL_ID.FIELD_ID = 'VALUE'
หากทำสำเร็จ เนื้อหาการตอบกลับจะมีอินสแตนซ์ไฟล์ทั้งหมดที่ตรงกับการค้นหา ดูข้อมูลเพิ่มเติมได้ที่หัวข้อค้นหาไฟล์ที่มีป้ายกำกับหรือ ค่าของช่องที่เฉพาะเจาะจง
ค้นหาในกลุ่มภาษาต่างๆ
โดยค่าเริ่มต้น ระบบจะตั้งค่าคอลเล็กชันรายการ user ในพารามิเตอร์การค้นหา corpora
เมื่อใช้วิธี list หากต้องการค้นหาคอลเล็กชันรายการอื่นๆ เช่น คอลเล็กชันที่แชร์กับ domain คุณต้องตั้งค่าพารามิเตอร์ corpora อย่างชัดเจน
คุณสามารถค้นหากลุ่มภาษาหลายกลุ่มในการค้นหาครั้งเดียวได้ แต่หากกลุ่มภาษาที่รวมกันมีขนาดใหญ่เกินไป API อาจแสดงผลการค้นหาที่ไม่สมบูรณ์ ให้ตรวจสอบช่อง
incompleteSearch
ในเนื้อหาการตอบกลับ หากเป็น true แสดงว่าระบบได้ละเว้นเอกสารบางรายการ หากต้องการแก้ไขปัญหานี้ ให้จำกัด corpora ให้ใช้ user หรือ drive
เมื่อใช้พารามิเตอร์การค้นหา
orderBy ในวิธี list ให้หลีกเลี่ยงการใช้คีย์ createdTime สำหรับการค้นหาในคอลเล็กชันรายการขนาดใหญ่ เนื่องจากต้องมีการประมวลผลเพิ่มเติมและอาจทำให้เกิดการหมดเวลาหรือปัญหาอื่นๆ สำหรับการจัดเรียงที่เกี่ยวข้องกับเวลาในคอลเล็กชันรายการขนาดใหญ่ คุณสามารถใช้ modifiedTime แทนได้ เนื่องจากมีการเพิ่มประสิทธิภาพเพื่อจัดการการค้นหาเหล่านี้
ตัวอย่างเช่น ตั้งค่า orderBy เป็น modifiedTime (หรือ modifiedTime desc)
หากไม่ใส่พารามิเตอร์การค้นหา orderBy จะไม่มีลำดับการจัดเรียงเริ่มต้นและระบบจะแสดงผลรายการแบบสุ่ม