#javascript #google-drive-api
#javascript #google-drive-api
Вопрос:
Я сделал, как в документации (https://developers.google.com/drive/api/v3/manage-uploads#http—single-request ), но это не работает:
var fileMetadata = {
name: e.target.files[j].name,
parents: this.currentDirectoryId ? [this.currentDirectoryId] : []
}
var media = {
mimeType: e.target.files[j].type,
body: e.target.files[j]
}
window.gapi.client.drive.files.create({
resource: fileMetadata,
media: media,
fields: 'id, name, mimeType, createdTime'
}).then(res => console.log(res))
Файл создан, но пустой и с именем «Без названия» с mimeType «application / octet-stream»
Комментарии:
1. Если имя неверно, исправьте имя: e.target. files[j].name, есть действительно способ, которым мы можем помочь вам отладить имя, поскольку вы не включили код, который его генерирует
2. Имя сгенерировано правильно, проблема не в e.target. files[j].name/
3. Скорее всего, сама структура запроса неверна.
Ответ №1:
Проблема и обходной путь:
- Когда я тестировал
gapi.client.drive.files.create
, кажется, что, хотя этот метод может создать новый файл с метаданными, содержимое файла не может быть включено. Итак, в этом ответе, чтобы загрузить файл, включив метаданные файла, я хотел бы предложить загрузить файл сmultipart/form-data
использованиемfetch
Javascript. В этом случае токен доступа извлекается с помощьюgapi.auth.getToken().access_token
. - К сожалению, из вашего скрипта я не смог понять
e.target
. Итак, в этом примере сценария я хотел бы предложить пример сценария для загрузки файла, который извлекается из входного тега, с метаданными.
Пример сценария:
Сторона HTML:
<input type="file" id="files" name="file">
Сторона Javascript:
const files = document.getElementById("files").files;
const file = files[0];
const fr = new FileReader();
fr.readAsArrayBuffer(file);
fr.onload = (f) => {
const fileMetadata = {
name: file.name,
parents: this.currentDirectoryId ? [this.currentDirectoryId] : [] // This is from your script.
}
const form = new FormData();
form.append('metadata', new Blob([JSON.stringify(fileMetadata)], {type: 'application/json'}));
form.append('file', new Blob([new Uint8Array(f.target.result)], {type: file.type}));
fetch('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart', {
method: 'POST',
headers: new Headers({'Authorization': 'Bearer ' gapi.auth.getToken().access_token}),
body: form
}).then(res => res.json()).then(res => console.log(res));
};
- В этом скрипте файл, полученный из
input
тега, загружается на Google Диск сmultipart/form-data
помощью .
Примечание:
- В этом сценарии предполагается, что ваш сценарий авторизации может использоваться для загрузки файла на Google Диск. Пожалуйста, будьте осторожны с этим.
- В этом ответе, в качестве примера сценария, файл загружается с
uploadType=multipart
помощью . В этом случае максимальный размер файла составляет 5 МБ. Пожалуйста, будьте осторожны с этим. Если вы хотите загрузить файл большого размера, пожалуйста, проверьте возможность возобновления загрузки. Ссылка
Ссылки:
Комментарии:
1. Спасибо! Это именно то, что я хотел сделать.
2. @Mikhail Спасибо, что ответили и протестировали его. Я рад, что ваша проблема была решена. И тебе спасибо.