Как заставить запрос на загрузку с Google диска base64 работать в iOS?

#javascript #ios #google-drive-api

Вопрос:

Я создаю форму, которая использует javascript для загрузки pdf-файла (созданного изнутри jsPDF-1.5.3) непосредственно в папку на Google диске с помощью API. Загрузка представляет собой составной запрос POST, созданный gapi.client.request, и данные закодированы в base64.

Я подозреваю, что с iOS и кодировкой base64 может происходить что-то странное. Если я опущу кодировку, она предполагает текст, и она успешно загружает текстовый файл (содержимое которого выглядит как правильное представление исходного PDF в формате base64). Если я укажу кодировку base64, запрос вместо этого завершится ошибкой с:

код: -1, Произошла сетевая ошибка, и запрос не удалось выполнить.

Я в основном тестирую на iPad, но он также не работает на двух разных iPhone, а также в Safari на одном из этих телефонов. Я предполагаю, что все они терпят неудачу одинаково, но на самом деле я только сбросил информацию об ошибке на iPad

Вот фрагменты кода на случай, если здесь что-то явно не так:

     var meta = {
      'name': file_date   '_'   form.name.value  '.pdf',
      parents: ['redacted folder hash'],
      'mimeType': 'application/pdf'
    };

    const boundary = '-------314159265358979323846';
    const delimiter = "rn--"   boundary   "rn";
    const close_delim = "rn--"   boundary   "--";
    var contentType = 'application/pdf'

    var base64Data = btoa(output);

    var multipartRequestBody =
      delimiter  
      'Content-Type: application/jsonrnrn'  
      JSON.stringify(meta )  
      delimiter  
      'Content-Type: '   contentType   'rn'  
      'Content-Transfer-Encoding: base64rn'  
      'rn'  
      base64Data  
      close_delim;

    console.log(multipartRequestBody)

    var request = gapi.client.request({
        'path': '/upload/drive/v3/files',
        'method': 'POST',
        'params': {'uploadType': 'multipart'},
        'headers': {
          'Content-Type': 'multipart/mixed; boundary="'   boundary   '"'
        },
        'body': multipartRequestBody})
        //'body': multipartRequestBody}).then(function(response) {
        //    console.log("success");
        //    console.log(response.result); }, function(response) {
        //    retry = 1;
        //    console.log("failure");
        //    console.log(response.result);
        //    console.log(JSON.stringify(response.result)); });

    console.log(JSON.stringify(request));

    var callback = function(file, raw) {
      console.log(file);
      console.log(JSON.stringify(file));
      console.log(JSON.stringify(raw));
    };

    request.execute(callback);
 

Я, конечно, опустил хэш для папки, и я бы отметил, что результаты будут одинаковыми, если я использую закомментированный «.then()» вместо «.execute ()», но выполнение позволяет мне выгрузить объект запроса перед его отправкой. Вот строка успешного объекта запроса с моего ПК с Windows, но я бы отметил, что за пределами фактических данных PDF объект выглядит так же на iPad (я сократил большую часть данных для краткости).:

 {"Id":0,"$a":{"Cf":null,"Vg":{"path":"/upload/drive/v3/files","method":"POST","params":{"uploadType":"multipart"},"headers":{"Content-Type":"multipart/mixed; boundary="-------314159265358979323846""},"body":"rn---------314159265358979323846rnContent-Type: application/jsonrnrn{"name":"2021_9_14_0_00_aaaa.pdf","parents":["redacted folder hash"],"mimeType":"application/pdf"}rn---------314159265358979323846rnContent-Type: application/pdfrnContent-Transfer-Encoding: base64rnrnJVBERi0xLjMKJbrfrOAKMyAw ... data cut for brevity ... EM2MUE3NTBFM0RBRDAyMTg IF0KPj4Kc3RhcnR4cmVmCjE1NDc1CiUlRU9Grn---------314159265358979323846--"},"Qk":"auto","NW":false,"tJ":false,"yL":false}}