Обновление файла для изменения типа MIME приводит к недопустимому типу MIME, предоставленному для загруженного содержимого

Эта проблема

У меня есть файл на Google Диске, который был загружен с помощью Google drive api v3. Рассматриваемый файл не был преобразован в таблицу Google при загрузке. (Да, мой код был испорчен, пытаюсь это исправить.)

Он был загружен с mime-типом text/csv. На изображении ниже его тип показан как Comma separated values.

введите описание изображения здесь

У меня есть еще один файл, который был загружен с правильным типом mime application/vnd.google-apps.spreadsheet, что привело к преобразованию файла в лист Google. Изображение ниже показывает его тип как Google sheet.

введите описание изображения здесь

Обновите файл и исправьте.

Я пытаюсь запустить file.update для файла, который был загружен с неправильным типом MIME, измените его тип MIME и снова загрузите файл, в результате чего он будет преобразован в лист Google.

Отправка следующих метаданных для файла должна привести к его преобразованию.

 'mimeType': 'application/vnd.google-apps.spreadsheet' 

К сожалению, это не приводит к следующей ошибке

ошибки: [{домен: 'global', причина: 'invalidContentType', сообщение: 'Недопустимый тип MIME для загруженного содержимого.', 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);

что я пробовал.

Чтобы проверить, что на самом деле это не проблема с моим кодом, я запустил код на лист, который был загружен правильно, и он работал нормально. Согласно документации MimeType должен быть доступен для записи

введите описание изображения здесь

Я затрудняюсь объяснить эту проблему. Мне интересно, не обладает ли метод обновления скрытой суперсилой, которой обладает метод создания.


comment
Спасибо за ответ. Я прошу прощения за доставленные неудобства. Из вашего ответа While I understand your workaround, the documentation states mine type is write able so I should be able to update it. I already know about the copy method I am trying to use the update method. я понял, что мой ответ не был полезен для вашей ситуации. Я глубоко извиняюсь за свои плохие навыки. Поэтому я хочу удалить свой ответ.   -  person Tanaike    schedule 25.04.2021
comment
@Tanaike Я бы хотел, чтобы вы не удаляли его, потому что я считаю его полезным в качестве обходного пути. Я собираюсь связаться с кем-нибудь из команды разработчиков, чтобы узнать, не является ли это ошибкой в ​​документации.   -  person DaImTo    schedule 25.04.2021
comment
Спасибо за ответ. Судя по вашему ответу, я снова открыл свой ответ. Если это будет полезно, я рад.   -  person Tanaike    schedule 26.04.2021


Ответы (1)


О 'Invalid MIME type provided for the uploaded content.:

  • Метод Files: update Drive API обновляет файл без изменения идентификатора файла.
  • The file ID depends on the mimeType.
    • For example, in your situation, the length of the file IDs of Google Docs files is different from the file ID of CSV file.

Когда ваша ситуация рассматривается, кажется, что вы пытаетесь изменить mimeType CSV-файла на Google Spreadsheet, используя метод Files: update Drive API. Если mimeType можно изменить с помощью метода Files: update, из приведенной выше ситуации необходимо также изменить идентификатор файла. Я догадывался, что такая ситуация может быть причиной текущего вопроса.

Чтобы проверить эту гипотезу, я провел следующие эксперименты.

Эксперименты:

  • Когда файл PNG обновляется файлом CSV с изменением mimeType text/csv, файл PNG преобразуется в файл CSV без изменения идентификатора файла.
  • Файл CSV можно преобразовать в файл PNG с использованием данных PNG без изменения идентификатора файла.
  • The mimeType of CSV file cannot be converted to image/png without changing the file content.
    • In order to change the mimeType, it seems that the data might be required to be used.
  • Когда mimeType не изменяется, а электронная таблица обновляется файлом CSV, это может быть достигнуто.
  • Когда тело запроса включает в себя изменение mimeType с электронной таблицы на CSV, а электронная таблица обновляется с помощью CSV-файла, электронная таблица обновляется данными CSV без изменения mimeType.
  • Когда тело запроса включает изменение mimeType с CSV на электронную таблицу, а файл CSV обновляется файлом CSV, возникает ошибка в вашем вопросе.
  • Файл CSV обновляется электронной таблицей Google, этого нельзя сделать. Поскольку файлы Google Docs не могут быть получены.

Исходя из приведенных выше результатов, рассматривается следующая ситуация.

  • It is considered that when the file is updated with "Files: update", when the file ID is NOT changed by the change of the mimeType, this can be achieved.
    • For example, CSV to PNG, PNG to CSV.
  • It is considered that when the file is updated with "Files: update", when the file ID is changed by the change of the mimeType, this cannot be achieved.
    • For example, CSV to Google Spreadsheet, Google Spreadsheet to CSV.
  • In order to change the mimeType, it seems that the data might be required to be used.
    • In my experiment, at least, media of 0 byte was required to be used for changing the mimeType.

Кроме того, приведенные выше результаты могут отвечать за возможность записи mimeType для файлов: update.

Измененный скрипт:

Что касается вашего скрипта, например, когда mimeType CSV-файла конвертируется в Google Spreadsheet, можно использовать метод Files: copy Drive API. В этом случае идентификатор преобразованного файла (электронной таблицы) изменяется из файла 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);
        }
      );
    }
  }
);
  • В модифицированном выше сценарии CSV-файл FILEIDTOUPDATE обновляется файлом sheet.csv с использованием метода Files: update. И файл CSV преобразуется в электронную таблицу Google с использованием метода Files: copy.
  • Если вам не требуется оставлять файл CSV, вы можете удалить файл CSV после выполнения метода Files: copy.

Использованная литература:

person Tanaike    schedule 25.04.2021
comment
Хотя я понимаю ваш обходной путь, в документации указано, что мой тип поддерживает запись, поэтому я смогу его обновить. Я уже знаю о методе копирования, я пытаюсь использовать метод обновления. - person DaImTo; 25.04.2021
comment
@DaImTo Спасибо за ответ. Я прошу прощения за доставленные неудобства. Из вашего ответа While I understand your workaround, the documentation states mine type is write able so I should be able to update it. I already know about the copy method I am trying to use the update method. я понял, что мой ответ не был полезен для вашей ситуации. Я глубоко извиняюсь за свои плохие навыки. Поэтому я хочу удалить свой ответ. - person Tanaike; 25.04.2021
comment
Я думаю, ваш ответ делает то, что ему нужно, вы проверяете, что тип пантомимы может быть нереалистично записываемым, и описываете, почему это не так. - person DaImTo; 26.04.2021
comment
@DaImTo Спасибо за ответ. Для меня большая честь. - person Tanaike; 26.04.2021