gpt4 book ai didi

javascript - 将文件上传到状态 200 的 Google Drive API,但该文件在哪里?

转载 作者:行者123 更新时间:2023-12-02 19:20:36 28 4
gpt4 key购买 nike

我正在尝试将文件上传到 Google 云端硬盘。运行该程序后,我得到状态 200,但在云端硬盘中找不到该文件。我在 parents 键下的 fileMetadata 变量中输入了文件夹 ID。

这是我的代码:

const { google } = require('googleapis');
const credentials = require('./credentials.json');
const fs = require('fs')

const scopes = [
'https://www.googleapis.com/auth/drive',
'https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive.appdata',
];

const auth = new google.auth.JWT(
credentials.client_email, null,
credentials.private_key, scopes
);

const drive = google.drive({ version: "v3", auth });

auth.authorize(function(err, tokens) {
if (err) {
console.log(err);
return;
} else {
console.log('It authorized successfully!');
console.log(`The Token is: ${JSON.stringify(tokens)}`)
var data = fs.createReadStream('./Test.txt')
var fileMetadata = {
'name': 'photo.txt',
'parents':[{'id':'1MiFB-XXWFRHjxZwTmE9FxsCGb9Een_2Y'}] //Folder ID
};
var media = {
mimeType: 'text/plain',
body: data //
};
drive.files.create({
resource: fileMetadata,
media: media,
fields: 'id'
}).then (function(err, file) {
if(err) {
// Handle error
console.log(err);
} else {
console.log('File Id: ', file.id);
}
});
}
});

这就是我得到的回复:

{
config: {
url: 'https://www.googleapis.com/upload/drive/v3/files?fields=id&uploadType=multipart',
method: 'POST',
paramsSerializer: [Function (anonymous)],
data: PassThrough {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
_flush: [Function: flush],
[Symbol(kCapture)]: false,
[Symbol(kTransformState)]: [Object]
},
headers: {
'Content-Type': 'multipart/related; boundary=7b25465c-4ee3-450d-b41c-7efd51e4637d',
'Accept-Encoding': 'gzip',
'User-Agent': 'google-api-nodejs-client/0.7.2 (gzip)',
Authorization: 'Bearer `TOKEN`,
Accept: 'application/json'
},
params: [Object: null prototype] { fields: 'id', uploadType: 'multipart' },
validateStatus: [Function (anonymous)],
body: PassThrough {
_readableState: [ReadableState],
_events: [Object: null prototype],
_eventsCount: 2,
_maxListeners: undefined,
_writableState: [WritableState],
allowHalfOpen: true,
_flush: [Function: flush],
[Symbol(kCapture)]: false,
[Symbol(kTransformState)]: [Object]
},
responseType: 'json'
},
data: { id: '1up-LCc9Fc0D2_t7OdJvF9D2QEVwxhV8y' },
headers: {
'alt-svc': 'h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"',
'cache-control': 'no-cache, no-store, max-age=0, must-revalidate',
connection: 'close',
'content-length': '47',
'content-type': 'application/json; charset=UTF-8',
date: 'Mon, 27 Jul 2020 09:54:42 GMT',
expires: 'Mon, 01 Jan 1990 00:00:00 GMT',
pragma: 'no-cache',
server: 'UploadServer',
vary: 'Origin, X-Origin',
'x-guploader-uploadid': 'AAANsUma96bf0mAHkz32b8QuarZvQBuez_rVwOmhVV-ESgd1IccLyYYnn3xdT--jVFDdo9zC9Qz_VqAVyaHK-OcQWFA'
},
status: 200,
statusText: 'OK'
}

文件在哪里?这里有什么不对吗?

谢谢!!

最佳答案

我相信您的目标和情况如下。

  • 您想要使用服务帐户将文件上传到 Google 云端硬盘。
  • 您已经能够使用 Drive API 和适用于 Node.js 的 googleapis 来上传文件。

修改点:

来自 After I run the program, I get status 200 but I can't find the file in Drive.以及脚本中的服务帐户,我认为问题的原因是上传的文件被放入服务帐户的Google Drive中。

该服务帐户与您的 Google 帐户不同。因此,当服务帐户上传文件时,该文件将被放入服务帐户的 Google Drive 中。这样,您就无法使用浏览器查看 Google 云端硬盘上的文件。

因此,为了在您的 Google 云端硬盘上查看服务帐户上传的文件,我建议采用以下 2 种模式。

模式 1:

在此模式中,文件将上传到 Google 云端硬盘中的文件夹。由此,请执行以下流程。

  1. 在您的 Google 云端硬盘中创建一个文件夹。
  2. 将创建的文件夹共享到服务帐户的电子邮件。
    • 您可以在服务帐户的凭据文件中看到服务帐户的电子邮件。
  3. 使用服务帐户将文件上传到共享文件夹。

通过此流程,您可以在 Google 云端硬盘的共享文件夹中看到上传的文件。

但是,在您的脚本中,需要进行一些修改。

修改后的脚本:

从:
var fileMetadata = {
'name': 'photo.txt',
'parents':[{'id':'1MiFB-XXWFRHjxZwTmE9FxsCGb9Een_2Y'}] //Folder ID
};
var media = {
mimeType: 'text/plain',
body: data //
};
drive.files.create({
resource: fileMetadata,
media: media,
fields: 'id'
}).then (function(err, file) {
if(err) {
// Handle error
console.log(err);
} else {
console.log('File Id: ', file.id);
}
});
到:
var fileMetadata = {
'name': 'photo.txt',
'parents':['### folderId of the folder shared with the service account ###'}] //Folder ID
};
var media = {
mimeType: 'text/plain',
body: data //
};
drive.files
.create({
resource: fileMetadata,
media: media,
fields: "id",
})
.then(function (file) {
const fileId = file.data.id;
console.log("File Id: ", fileId);
})
.catch(function (err) {
console.log(err);
});

模式 2:

在此模式中,文件将上传到服务帐户的 Google 云端硬盘,并为您的 Google 帐户创建该文件的权限。这样,您就可以在“与我共享”中看到上传的文件。

修改后的脚本:

从:
var fileMetadata = {
'name': 'photo.txt',
'parents':[{'id':'1MiFB-XXWFRHjxZwTmE9FxsCGb9Een_2Y'}] //Folder ID
};
var media = {
mimeType: 'text/plain',
body: data //
};
drive.files.create({
resource: fileMetadata,
media: media,
fields: 'id'
}).then (function(err, file) {
if(err) {
// Handle error
console.log(err);
} else {
console.log('File Id: ', file.id);
}
});
到:
var fileMetadata = {
'name': 'photo.txt',
};
var media = {
mimeType: 'text/plain',
body: data //
};
drive.files
.create({
resource: fileMetadata,
media: media,
fields: "id",
})
.then(function (file) {
const fileId = file.data.id;
console.log("File Id: ", fileId);
drive.permissions.create(
{
resource: {
type: "user",
role: "writer",
emailAddress: "###", // <--- Please set the email of your Google account.
},
fileId: fileId,
fields: "id",
},
function (err, res) {
if (err) {
console.log(err);
return;
}
console.log(res.data);
}
);
})
.catch(function (err) {
console.log(err);
});
  • 在这种情况下,服务帐户上传的文件(Google 文档文件除外)的所有者尚无法更改。但我相信当You can't yet change the owner of this item. (We're working on it.)的错误信息出现时可见,这将在以后的更新中实现。

注意:

  • 我可以确认上述修改后的脚本适用于 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="61060e0e060d04001108122154574f514f51" rel="noreferrer noopener nofollow">[email protected]</a> .

引用文献:

关于javascript - 将文件上传到状态 200 的 Google Drive API,但该文件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63113116/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com