Проблемы с загрузкой CSV-файлов с Google Диска

Stringify не решает всех проблем

Кажется, что ответы здесь не охватывают все типы, которые возможны в JavaScript, поэтому вот несколько коротких примеров того, как правильно их решить:

//Objects and Arrays:
    var obj = {key: "value"};
    localStorage.object = JSON.stringify(obj);  //Will ignore private members
    obj = JSON.parse(localStorage.object);
//Boolean:
    var bool = false;
    localStorage.bool = bool;
    bool = (localStorage.bool === "true");
//Numbers:
    var num = 42;
    localStorage.num = num;
    num = +localStorage.num;    //short for "num = parseFloat(localStorage.num);"
//Dates:
    var date = Date.now();
    localStorage.date = date;
    date = new Date(parseInt(localStorage.date));
//Regular expressions:
    var regex = /^No\.[\d]*$/i;     //usage example: "No.42".match(regex);
    localStorage.regex = regex;
    var components = localStorage.regex.match("^/(.*)/([a-z]*)$");
    regex = new RegExp(components[1], components[2]);
//Functions (not recommended):
    function func(){}
    localStorage.func = func;
    eval( localStorage.func );      //recreates the function with the name "func"

Я не рекомендую хранить функции, потому что eval() злой может привести к проблемам безопасности, оптимизации и отладки. В общем случае eval() никогда не следует использовать в JavaScript-коде.

Частные члены

Проблема с использованием JSON.stringify() для хранения объектов заключается в том, что эта функция не может сериализовать закрытых членов , Эта проблема может быть решена путем перезаписи метода .toString() (который неявно используется при хранении данных в веб-хранилище):

//Object with private and public members:
    function MyClass(privateContent, publicContent){
        var privateMember = privateContent || "defaultPrivateValue";
        this.publicMember = publicContent  || "defaultPublicValue";

        this.toString = function(){
            return '{"private": "' + privateMember + '", "public": "' + this.publicMember + '"}';
        };
    }
    MyClass.fromString = function(serialisedString){
        var properties = JSON.parse(serialisedString || "{}");
        return new MyClass( properties.private, properties.public );
    };
//Storing:
    var obj = new MyClass("invisible", "visible");
    localStorage.object = obj;
//Loading:
    obj = MyClass.fromString(localStorage.object);

Циркулярные ссылки

Другая проблема stringify может В этом примере JSON.stringify() выдаст TypeError «Преобразование круговой структуры в JSON» . Если нужно сохранить циклические ссылки, может быть использован второй параметр JSON.stringify():

var obj = {id: 1, sub: {}};
obj.sub["circular"] = obj;
localStorage.object = JSON.stringify( obj, function( key, value) {
    if( key == 'circular') {
        return "$ref"+value.id+"$";
    } else {
        return value;
    }
});

Однако найти эффективное решение для хранения циклических ссылок сильно зависит от задач, которые необходимо решить, и восстановление таких данных также не является тривиальным.

Уже существует некоторый вопрос о SO, посвященный этой проблеме: Stringify (конвертировать в JSON) объект JavaScript с круглой ссылкой

0
задан DaImTo 20 March 2019 в 12:54
поделиться

1 ответ

В Drive метаданные файла отделены от его содержимого. Вы запросили metadata.readonly область действия, которая неудивительно, что позволяет только доступ к метаданным. Ваш звонок на files().get получает метаданные.

Чтобы получить контент, сначала нужно выбрать более разрешающую область. Затем вы получите содержимое. Как это сделать, зависит от того, является ли файл двоичным файлом или документом Google (например, электронной таблицей).

Бинарный файл можно загрузить, добавив alt=media к URL-адресу.

Файл Google можно экспортировать, добавив /export?mimeType=text/csv к URL-адресу.

См. https://developers.google.com/drive/api/v3/manage-downloads для получения подробной информации и примеров кода.

0
ответ дан pinoyyid 20 March 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: