更新文件以更改 "Invalid MIME type provided for the uploaded content" 中的 MIME 类型结果
Update file to change mime type results in "Invalid MIME type provided for the uploaded content"
问题
我在 Google 驱动器上有一个文件,它是使用 Google 驱动器 api v3 上传的。
相关文件在上传时未转换为 Google sheet。 (是的,我的代码搞砸了,正在尝试修复它。)
上传的 mime 类型为 text/csv
下图显示其类型为 Comma separated values
。
我有另一个上传的文件使用了正确的 MIME 类型 application/vnd.google-apps.spreadsheet
,这导致文件被转换为 Google sheet。下图显示其类型为 Google sheet
更新文件并修复它。
我想做的是 运行 对上传的文件使用错误的 mime 类型 file.update 并更改其 mime 类型并再次上传文件,导致文件被转换Google sheet.
发送以下内容作为文件的元数据应该会导致它被转换。
'mimeType': 'application/vnd.google-apps.spreadsheet'
不幸的是它没有导致以下错误
errors: [
{
domain: 'global',
reason: 'invalidContentType',
message: 'Invalid MIME type provided for the uploaded content.',
locationType: 'other',
location: 'media.mimeType'
}
我的代码
const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
// npm install googleapis
// https://developers.google.com/drive/api/v3/quickstart/nodejs
// Desktop app credentials from Google Cloud console.
const KEYFILEPATH = 'C:\Youtube\dev\ServiceAccountCred.json';
const FILEIDTOUPDATE = '1YtJxL1WptkHUbDHNWpcbKwcRs7rPo_cY';
// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/drive'];
// Create a service account initialize with the service account key file and scope needed
const auth = new google.auth.GoogleAuth({
keyFile: KEYFILEPATH,
scopes: SCOPES
});
/**
* Creates a new file on google drive and uploads it.
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
async function createAndUploadFile(auth) {
const driveService = google.drive({version: 'v3', auth});
let fileMetadata = {
'name': 'sheet',
'mimeType': 'application/vnd.google-apps.spreadsheet' // will cause the file to be converted to the google drive type.
};
let media = {
mimeType: 'text/csv',
body: fs.createReadStream('sheet.csv')
};
await driveService.files.update({
fileId : FILEIDTOUPDATE,
resource: fileMetadata,
media: media,
fields: 'id'
}, function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('File Id: ', file.data.id);
}
});
}
createAndUploadFile(auth).catch(console.error);
我试过的。
为了测试这实际上不是我的代码的问题,我 运行 针对 sheet 的代码已正确上传并且运行良好。根据文档 MimeType 应该是可写的
我不知道如何解释这个问题。我想知道 update 方法是否没有 create 方法所具有的隐蔽超能力。
关于'Invalid MIME type provided for the uploaded content.
:
- 驱动器API的“文件:更新”方法更新文件而不改变文件ID。
- 文件 ID 取决于 mimeType。
- 例如,在您的情况下,Google Docs 文件的文件 ID 长度与 CSV 文件的文件 ID 不同。
考虑到您的情况,您似乎正试图使用驱动器 API 的“文件:更新”方法将 CSV 文件的 mimeType 更改为 Google 电子表格。如果mimeType可以用“Files:update”方法改变,从上面的情况来看,文件ID也需要改变。我猜测这种情况可能是当前问题的原因。
为了验证这个假设,我做了以下实验。
实验:
- 当 PNG 文件被 CSV 文件更新并更改
text/csv
的 mimeType 时,PNG 文件将转换为 CSV 文件而不更改文件 ID。
- 无需更改文件 ID,即可使用 PNG 数据将 CSV 文件转换为 PNG 文件。
- CSV 文件的 mimeType 无法在不更改文件内容的情况下转换为
image/png
。
- 为了改变mimeType,似乎需要使用数据。
- mimeType不变,电子表格由CSV文件更新时,可以实现
- 当请求正文包括将 mimeType 从电子表格更改为 CSV 并且电子表格由 CSV 文件更新时,电子表格由 CSV 数据更新而不更改 mimeType。
- 当请求正文包含将mimeType从CSV更改为Spreadsheet并且CSV文件由CSV文件更新时,就会出现您问题中的错误。
- CSV 文件由 Google 电子表格更新,无法实现。因为无法检索 Google 个 Docs 文件。
从以上结果来看,认为是以下情况。
- 认为当用“Files:update”更新文件时,当文件ID不因mimeType的改变而改变时,可以实现。
- 例如,CSV 到 PNG,PNG 到 CSV。
- 考虑到用“Files:update”更新文件时,通过mimeType的改变改变文件ID时,无法实现。
- 例如,CSV 到 Google 电子表格,Google 电子表格到 CSV。
- 为了改变mimeType,似乎需要使用数据。
- 在我的实验中,至少需要
media
个 0 字节来更改 mimeType。
此外,上述结果可能能够回答“文件:更新”的 mimeType 的“可写”。
修改后的脚本:
关于你的脚本,比如CSV文件的mimeType转换为Google电子表格时,可以使用DriveAPI的“Files:copy”方法。在这种情况下,转换后的文件(电子表格)的文件 ID 与 CSV 文件不同。所以,我认为你的脚本可以修改如下。
const driveService = google.drive({ version: 'v3', auth });
let fileMetadata = { name: 'sheet' };
let media = {
mimeType: 'text/csv',
body: fs.createReadStream('sheet.csv'),
};
driveService.files.update(
{
fileId: FILEIDTOUPDATE,
resource: fileMetadata,
media: media,
fields: 'id',
},
function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('File Id: ', file.data.id);
driveService.files.copy(
{
fileId: FILEIDTOUPDATE,
resource: { mimeType: "application/vnd.google-apps.spreadsheet" },
},
function (err, { data }) {
if (err) {
console.error(err);
return;
}
console.log(data);
}
);
}
}
);
- 在上面修改的脚本中,
FILEIDTOUPDATE
的 CSV 文件由 sheet.csv
的文件使用“文件:更新”的方法更新。并且,使用“文件:复制”的方法将 CSV 文件转换为 Google 电子表格。
- 如果不需要留下CSV文件,可以在“文件:复制”方法完成后删除CSV文件。
参考文献:
问题
我在 Google 驱动器上有一个文件,它是使用 Google 驱动器 api v3 上传的。 相关文件在上传时未转换为 Google sheet。 (是的,我的代码搞砸了,正在尝试修复它。)
上传的 mime 类型为 text/csv
下图显示其类型为 Comma separated values
。
我有另一个上传的文件使用了正确的 MIME 类型 application/vnd.google-apps.spreadsheet
,这导致文件被转换为 Google sheet。下图显示其类型为 Google sheet
更新文件并修复它。
我想做的是 运行 对上传的文件使用错误的 mime 类型 file.update 并更改其 mime 类型并再次上传文件,导致文件被转换Google sheet.
发送以下内容作为文件的元数据应该会导致它被转换。
'mimeType': 'application/vnd.google-apps.spreadsheet'
不幸的是它没有导致以下错误
errors: [ { domain: 'global', reason: 'invalidContentType', message: 'Invalid MIME type provided for the uploaded content.', locationType: 'other', location: 'media.mimeType' }
我的代码
const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
// npm install googleapis
// https://developers.google.com/drive/api/v3/quickstart/nodejs
// Desktop app credentials from Google Cloud console.
const KEYFILEPATH = 'C:\Youtube\dev\ServiceAccountCred.json';
const FILEIDTOUPDATE = '1YtJxL1WptkHUbDHNWpcbKwcRs7rPo_cY';
// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/drive'];
// Create a service account initialize with the service account key file and scope needed
const auth = new google.auth.GoogleAuth({
keyFile: KEYFILEPATH,
scopes: SCOPES
});
/**
* Creates a new file on google drive and uploads it.
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
async function createAndUploadFile(auth) {
const driveService = google.drive({version: 'v3', auth});
let fileMetadata = {
'name': 'sheet',
'mimeType': 'application/vnd.google-apps.spreadsheet' // will cause the file to be converted to the google drive type.
};
let media = {
mimeType: 'text/csv',
body: fs.createReadStream('sheet.csv')
};
await driveService.files.update({
fileId : FILEIDTOUPDATE,
resource: fileMetadata,
media: media,
fields: 'id'
}, function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('File Id: ', file.data.id);
}
});
}
createAndUploadFile(auth).catch(console.error);
我试过的。
为了测试这实际上不是我的代码的问题,我 运行 针对 sheet 的代码已正确上传并且运行良好。根据文档 MimeType 应该是可写的
我不知道如何解释这个问题。我想知道 update 方法是否没有 create 方法所具有的隐蔽超能力。
关于'Invalid MIME type provided for the uploaded content.
:
- 驱动器API的“文件:更新”方法更新文件而不改变文件ID。
- 文件 ID 取决于 mimeType。
- 例如,在您的情况下,Google Docs 文件的文件 ID 长度与 CSV 文件的文件 ID 不同。
考虑到您的情况,您似乎正试图使用驱动器 API 的“文件:更新”方法将 CSV 文件的 mimeType 更改为 Google 电子表格。如果mimeType可以用“Files:update”方法改变,从上面的情况来看,文件ID也需要改变。我猜测这种情况可能是当前问题的原因。
为了验证这个假设,我做了以下实验。
实验:
- 当 PNG 文件被 CSV 文件更新并更改
text/csv
的 mimeType 时,PNG 文件将转换为 CSV 文件而不更改文件 ID。 - 无需更改文件 ID,即可使用 PNG 数据将 CSV 文件转换为 PNG 文件。
- CSV 文件的 mimeType 无法在不更改文件内容的情况下转换为
image/png
。- 为了改变mimeType,似乎需要使用数据。
- mimeType不变,电子表格由CSV文件更新时,可以实现
- 当请求正文包括将 mimeType 从电子表格更改为 CSV 并且电子表格由 CSV 文件更新时,电子表格由 CSV 数据更新而不更改 mimeType。
- 当请求正文包含将mimeType从CSV更改为Spreadsheet并且CSV文件由CSV文件更新时,就会出现您问题中的错误。
- CSV 文件由 Google 电子表格更新,无法实现。因为无法检索 Google 个 Docs 文件。
从以上结果来看,认为是以下情况。
- 认为当用“Files:update”更新文件时,当文件ID不因mimeType的改变而改变时,可以实现。
- 例如,CSV 到 PNG,PNG 到 CSV。
- 考虑到用“Files:update”更新文件时,通过mimeType的改变改变文件ID时,无法实现。
- 例如,CSV 到 Google 电子表格,Google 电子表格到 CSV。
- 为了改变mimeType,似乎需要使用数据。
- 在我的实验中,至少需要
media
个 0 字节来更改 mimeType。
- 在我的实验中,至少需要
此外,上述结果可能能够回答“文件:更新”的 mimeType 的“可写”。
修改后的脚本:
关于你的脚本,比如CSV文件的mimeType转换为Google电子表格时,可以使用DriveAPI的“Files:copy”方法。在这种情况下,转换后的文件(电子表格)的文件 ID 与 CSV 文件不同。所以,我认为你的脚本可以修改如下。
const driveService = google.drive({ version: 'v3', auth });
let fileMetadata = { name: 'sheet' };
let media = {
mimeType: 'text/csv',
body: fs.createReadStream('sheet.csv'),
};
driveService.files.update(
{
fileId: FILEIDTOUPDATE,
resource: fileMetadata,
media: media,
fields: 'id',
},
function (err, file) {
if (err) {
// Handle error
console.error(err);
} else {
console.log('File Id: ', file.data.id);
driveService.files.copy(
{
fileId: FILEIDTOUPDATE,
resource: { mimeType: "application/vnd.google-apps.spreadsheet" },
},
function (err, { data }) {
if (err) {
console.error(err);
return;
}
console.log(data);
}
);
}
}
);
- 在上面修改的脚本中,
FILEIDTOUPDATE
的 CSV 文件由sheet.csv
的文件使用“文件:更新”的方法更新。并且,使用“文件:复制”的方法将 CSV 文件转换为 Google 电子表格。 - 如果不需要留下CSV文件,可以在“文件:复制”方法完成后删除CSV文件。