Я использую Google Drive Picker, чтобы позволить пользователям загружать файлы со своего собственного Google Drive. Я использую https://www.googleapis.com/auth/drive.file Scope для разрешений.
Пользователи могут вручную выбирать отдельные файлы, используя сборщик, и эта часть работает нормально. Однако, когда я пытаюсь загрузить эти файлы, используя URL -адреса, возвращаемые Sicker (через простой запрос ), я получаю ошибку 404, не найденный - и это происходит для всех типов файлов. разрешение? Из того, что я понимаю, Drive.file дает доступ только к файлам, явно выбранным пользователем, что я хочу. Вот упрощенная версия кода, который я использую, включая логику загрузки, настройку сбора и обработку токенов доступа: < /p>
import useDrivePicker from "react-google-drive-picker";
import { useGoogleLogin } from "@react-oauth/google";
// Mapping for Google file types (Docs, Sheets, etc.) to export MIME types and extensions
const GOOGLE_FILES_MIMES = {
"application/vnd.google-apps.document": {
exportMimeType: "application/pdf",
fileExtension: "pdf",
},
};
const buildDownloadUrl = (file: CallbackDoc): string | null => {
if (file.downloadUrl) return file.downloadUrl;
if (file.mimeType.startsWith("application/vnd.google-apps")) {
const exportMimeType = GOOGLE_FILES_MIMES[file.mimeType]?.exportMimeType;
if (exportMimeType) {
return `https://www.googleapis.com/drive/v3/fil ... rtMimeType}`;
}
}
return `https://www.googleapis.com/drive/v3/fil ... ?alt=media`;
};
const downloadMultipleSelectedFiles = async (files: CallbackDoc[]) => {
if (!accessToken) return;
setIsUploading(true);
setUploadingStarted(true);
setTotalFiles(files.length);
setProgress(0);
const downloadedFiles = await Promise.all(
files.map(async (file) => {
const downloadUrl = buildDownloadUrl(file);
if (!downloadUrl) return null;
try {
const blob = await downloadWithUrl(downloadUrl, accessToken);
let fileName = file.name;
const fileExtension = GOOGLE_FILES_MIMES[file.mimeType]?.fileExtension;
if (fileExtension && !fileName.endsWith(`.${fileExtension}`)) {
fileName += `.${fileExtension}`;
}
return { file: new File([blob], fileName), name: fileName };
} catch (error) {
console.error(`Failed to download ${file.name}:`, error);
return null;
} finally {
setProgress((prev) => prev + 1);
}
})
);
const fileContainers = downloadedFiles
.filter(Boolean)
.map((f) => ({ file: f!.file, relativePath: f!.name }));
if (fileContainers.length > 0) {
addAllFilesToGroup("googleDrive", fileContainers);
onFilesUploaded(fileContainers);
}
setIsUploading(false);
setUploadingStarted(false);
return fileContainers;
};
// Login using the drive.file scope
const login = useGoogleLogin({
onSuccess: (response) => {
setAccessToken(response.access_token);
setTimeout(() => buttonRef.current?.click(), 1);
},
onError: (error) => console.error("Login error:", error),
scope: "https://www.googleapis.com/auth/drive.file",
});
// Open the Google Picker
openPicker({
clientId: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID,
developerKey: process.env.NEXT_PUBLIC_GOOGLE_DEVELOPER_KEY,
viewId: "DOCS",
showUploadView: true,
showUploadFolders: true,
supportDrives: true,
multiselect: true,
setIncludeFolders: false,
setSelectFolderEnabled: false,
setOrigin: window.location.origin,
token: accessToken,
callbackFunction: async (data) => {
if (data.action !== "picked" || !data.docs.length || !accessToken) return;
const fileContainers = await downloadMultipleSelectedFiles(data.docs);
console.log("Downloaded:", fileContainers);
},
});
< /code>
Невозможно получить файлы из-за отсутствия доступа < /p>
{
"error": {
"code": 404,
"message": "File not found: 1UVDy3bzMD5n0Ty2ovd6cOkX99vp7hMYx.",
"errors": [
{
"message": "File not found: 1UVDy3bzMD5n0Ty2ovd6cOkX99vp7hMYx.",
"domain": "global",
"reason": "notFound",
"location": "fileId",
"locationType": "parameter"
}
]
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... le-permiss
Могу ли я загрузить все файлы из выбранного каталога, используя только разрешение Drive.file? ⇐ Javascript
Форум по Javascript
1753806478
Anonymous
Я использую Google Drive Picker, чтобы позволить пользователям загружать файлы со своего собственного Google Drive. Я использую https://www.googleapis.com/auth/drive.file Scope для разрешений.
Пользователи могут вручную выбирать отдельные файлы, используя сборщик, и эта часть работает нормально. Однако, когда я пытаюсь загрузить эти файлы, используя URL -адреса, возвращаемые Sicker (через простой запрос ), я получаю ошибку 404, не найденный - и это происходит для всех типов файлов. разрешение? Из того, что я понимаю, Drive.file дает доступ только к файлам, явно выбранным пользователем, что я хочу. Вот упрощенная версия кода, который я использую, включая логику загрузки, настройку сбора и обработку токенов доступа: < /p>
import useDrivePicker from "react-google-drive-picker";
import { useGoogleLogin } from "@react-oauth/google";
// Mapping for Google file types (Docs, Sheets, etc.) to export MIME types and extensions
const GOOGLE_FILES_MIMES = {
"application/vnd.google-apps.document": {
exportMimeType: "application/pdf",
fileExtension: "pdf",
},
};
const buildDownloadUrl = (file: CallbackDoc): string | null => {
if (file.downloadUrl) return file.downloadUrl;
if (file.mimeType.startsWith("application/vnd.google-apps")) {
const exportMimeType = GOOGLE_FILES_MIMES[file.mimeType]?.exportMimeType;
if (exportMimeType) {
return `https://www.googleapis.com/drive/v3/files/${file.id}/export?mimeType=${exportMimeType}`;
}
}
return `https://www.googleapis.com/drive/v3/files/${file.id}?alt=media`;
};
const downloadMultipleSelectedFiles = async (files: CallbackDoc[]) => {
if (!accessToken) return;
setIsUploading(true);
setUploadingStarted(true);
setTotalFiles(files.length);
setProgress(0);
const downloadedFiles = await Promise.all(
files.map(async (file) => {
const downloadUrl = buildDownloadUrl(file);
if (!downloadUrl) return null;
try {
const blob = await downloadWithUrl(downloadUrl, accessToken);
let fileName = file.name;
const fileExtension = GOOGLE_FILES_MIMES[file.mimeType]?.fileExtension;
if (fileExtension && !fileName.endsWith(`.${fileExtension}`)) {
fileName += `.${fileExtension}`;
}
return { file: new File([blob], fileName), name: fileName };
} catch (error) {
console.error(`Failed to download ${file.name}:`, error);
return null;
} finally {
setProgress((prev) => prev + 1);
}
})
);
const fileContainers = downloadedFiles
.filter(Boolean)
.map((f) => ({ file: f!.file, relativePath: f!.name }));
if (fileContainers.length > 0) {
addAllFilesToGroup("googleDrive", fileContainers);
onFilesUploaded(fileContainers);
}
setIsUploading(false);
setUploadingStarted(false);
return fileContainers;
};
// Login using the drive.file scope
const login = useGoogleLogin({
onSuccess: (response) => {
setAccessToken(response.access_token);
setTimeout(() => buttonRef.current?.click(), 1);
},
onError: (error) => console.error("Login error:", error),
scope: "https://www.googleapis.com/auth/drive.file",
});
// Open the Google Picker
openPicker({
clientId: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID,
developerKey: process.env.NEXT_PUBLIC_GOOGLE_DEVELOPER_KEY,
viewId: "DOCS",
showUploadView: true,
showUploadFolders: true,
supportDrives: true,
multiselect: true,
setIncludeFolders: false,
setSelectFolderEnabled: false,
setOrigin: window.location.origin,
token: accessToken,
callbackFunction: async (data) => {
if (data.action !== "picked" || !data.docs.length || !accessToken) return;
const fileContainers = await downloadMultipleSelectedFiles(data.docs);
console.log("Downloaded:", fileContainers);
},
});
< /code>
Невозможно получить файлы из-за отсутствия доступа < /p>
{
"error": {
"code": 404,
"message": "File not found: 1UVDy3bzMD5n0Ty2ovd6cOkX99vp7hMYx.",
"errors": [
{
"message": "File not found: 1UVDy3bzMD5n0Ty2ovd6cOkX99vp7hMYx.",
"domain": "global",
"reason": "notFound",
"location": "fileId",
"locationType": "parameter"
}
]
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79718793/can-i-download-all-files-from-a-selected-directory-using-only-drive-file-permiss[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия