Могу ли я загрузить все файлы из выбранного каталога, используя только разрешение Drive.file?Javascript

Форум по Javascript
Ответить
Anonymous
 Могу ли я загрузить все файлы из выбранного каталога, используя только разрешение Drive.file?

Сообщение 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/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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»