Используйте Google Drive API, чтобы загрузить файл CSV на диск пользователя без серверной части - PullRequest
1 голос
/ 18 июня 2020

Я разрабатываю расширение Chrome, в котором я создаю файл CSV, и при нажатии кнопки я хочу сохранить этот файл CSV на диске пользователя.

Сначала я попытался добавить кнопку / виджет «Сохранить на диск» (https://developers.google.com/drive/api/v3/savetodrive) в свой HTML, однако я обнаружил, что это не будет работать в моем CSV-файле. не сохраняется локально, а генерируется из текстового содержимого с использованием: blob = new Blob([csv], {type: "text/csv"}); href = window.URL.createObjectURL(blob);, где csv - это строка, хранящая данные в формате CSV. В результате этого переменная href является не URL-адресом, а URI большого двоичного объекта, который не поддерживается в качестве атрибута data-src при использовании кнопки «Сохранить на диск» (из документации: «URI данных и file:// URL не поддерживаются ")

Второй подход заключается в использовании API Google Диска, однако я не нашел хороших примеров того, как использовать этот API только в чисто интерфейсных приложениях без серверной части. Большинство примеров из документации находятся в Python или node. Единственный пример на основе браузера в документации (https://developers.google.com/drive/api/v3/quickstart/js) требует запуска сервера localhost, что невозможно в расширении Chrome. Попытка использовать этот пример из документации без запуска сервера localhost приводит к следующей ошибке: Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('file://') does not match the recipient window's origin ('null').

Я знаю, что конечная точка загрузки Drive API поддерживает CORS, поэтому я не знаю, зачем мне нужен localhost для выполнения запросов к Drive API или для использования gapi.client из https://apis.google.com/js/api.js. Таким образом, я не считаю, что то, что я ищу, слишком сложно; сохранить CSV-файл на Google Диске без использования внутреннего сервера. Кажется, что это возможно, но я не встречал никаких примеров или документации о том, как добиться этого в чисто интерфейсных приложениях.

function saveToDrive() { // Function that is called when the button is clicked.
    csv = document.getElementById("userInput").value // User inputs CSV formatted data, this data is captured and stored in a string
    blob = new Blob([csv], {type: "text/csv"}); 
    href = window.URL.createObjectURL(blob);
    // Code to upload this file to the logged in user's Google Drive (what I need)
}
...