Что работает:
- Выбор Google:
- Успешно внедрил Google Средство выбора, позволяющее пользователям выбирать файлы.
- Правильное средство выбора. извлекает имя файла и идентификатор файла.
- Сервер -Боковой код:
- Когда файл выбран, его идентификатор отправляется в серверную часть Flask.
- Попытайтесь получить файл с помощью Drive API.
Проблема:
При попытке получить содержимое файла с использованием идентификатора файла в моей серверной части я получаю следующую ошибку
[code]perl[/code]
[code]Copy[/code]
[code]Edit[/code]
[code][/code]
Похоже, у меня нет разрешения на доступ к файлу, хотя я использую область диска.file и явно выбираю файл через средство выбора.
Обзор кода:
HTML + JavaScript для средства выбора:
Код: Выделить всё
function onApiLoad() {
gapi.load('picker', { 'callback': onPickerApiLoad });
}
function onPickerApiLoad() {
const oauthToken = ''; // Retrieved from backend securely
const picker = new google.picker.PickerBuilder()
.addView(google.picker.ViewId.DOCS)
.setOAuthToken(oauthToken)
.setDeveloperKey('')
.setCallback(pickerCallback)
.build();
picker.setVisible(true);
}
function pickerCallback(data) {
if (data.action === google.picker.Action.PICKED) {
const file = data.docs[0];
console.log('File ID:', file.id);
// Send the file ID to the backend for further processing
fetch('/process_file', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ fileId: file.id }),
})
.then(response => response.json())
.then(data => console.log('Backend response:', data))
.catch(error => console.error('Error:', error));
}
}
Код: Выделить всё
from flask import Flask, request, jsonify
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
import io
app = Flask(__name__)
SCOPES = ['https://www.googleapis.com/auth/drive.file'] # Limited scope
@app.route('/process_file', methods=['POST'])
def process_file():
data = request.json
file_id = data.get('fileId')
credentials = Credentials.from_authorized_user_file('credentials.json', SCOPES)
service = build('drive', 'v3', credentials=credentials)
try:
# Attempting to fetch file metadata
file_metadata = service.files().get(fileId=file_id, fields='id, name, mimeType').execute()
print(f"File metadata: {file_metadata}")
# Example: Modify the file's content
request = service.files().get_media(fileId=file_id)
file_content = request.execute()
new_content = file_content.decode('utf-8') + '\nAppended Text.'
media = MediaIoBaseUpload(io.BytesIO(new_content.encode()), mimetype='text/plain')
updated_file = service.files().update(fileId=file_id, media_body=media).execute()
return jsonify({'status': 'success', 'updatedFile': updated_file})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
Мои вопросы:
- Как я могу убедиться, что выбранный файл с помощью Google Picker доступен с использованием области диска.file?
- Нужно ли выполнить дополнительный шаг, чтобы связать выбор Picker с токен доступа к API Диска?
- Может ли эта проблема быть связано с тем, как средство выбора генерирует идентификатор файла или как обрабатываются разрешения для выбранного файла?
Я уже пытался найти ответ, но нашел только один 2011 года, и он не дает никаких подробностей о том, как это сделать. это.
Что я пробовал:
Подтвердил, что идентификатор файла правильно передается из средства выбора в серверную часть.
Проверено, что токен OAuth и ключ API работают для других операций Drive API (например, создания файлов).
Прочитайте документацию для API Picker и Drive API, чтобы подтвердить, что область диска.файл должна разрешать доступ к файлы, явно выбранные пользователем.
Подробнее здесь: https://stackoverflow.com/questions/793 ... e-scope-in
Мобильная версия