#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}}