Проблема с созданием файла в google drive service account через Api

135
20 ноября 2019, 03:50

На данном этапе, у меня получилось сделать авторизацию в service account по jwt, создать папку и пермишены. С файлами проблема: когда я перехожу по ссылке https://drive.google.com/uc?export=view&id={file.id}, вместо загруженной картинки я вижу чёрный квадрат. Попытался скачать файл, перейдя по embedUrl свойству файла, но приложение для просмотра изображений сказало, что такой формат не поддерживается.

private static String initiateResumable(string base64, string fileType){
    String endpoint ='https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable';
    map<String, Object> md = new map<String, Object>();
    md.put('name', 'demofile'); 
    md.put('parents', '[' + folderId + ']'); 
    String metadata = JSON.serialize(md);
    Integer size = Math.min(2000000, base64.length());
//return an HttpRequest object of POST method with
// Authorization token provided (JWT is used)
    HttpRequest req = createRequest('post');
    req.setEndpoint(endpoint);
    req.setHeader('Content-Type', 'application/json; charset=UTF-8');
    req.setHeader('Content-Length', String.valueOf(metadata.length()));
    req.setHeader('X-Upload-Content-Type', fileType);
    req.setHeader('X-Upload-Content-Length', String.valueOf(size));
    req.setBody(metadata);
    HttpResponse res = (new Http()).send(req);
    return res.getHeader('Location');
}
private static File sendFile(String base64, String fileType, String endpoint){
    Integer size = Math.min(2000000, base64.length());
    HttpRequest req = createRequest('put');
    HttpResponse res;
    req.setEndpoint(endpoint);
    req.setHeader('Content-Type', fileType);
    while(! String.isBlank(base64)){
        final string buffer = base64.left(size);
        base64 = base64.removeStart(buffer);
        req.setHeader('Content-Length', String.valueOf(buffer.length()));
        req.setBody(buffer);
        res = (new Http()).send(req);
    }
    return (File)JSON.deserialize(res.getBody(), File.class);
}

Попытался упростить и попробовать не resumable (хоть он и предпочтительнее), а через media:

HttpRequest req = createRequest('get');
req.setEndpoint('https://www.googleapis.com/upload/drive/v3/files?uploadType=media');
req.setHeader('Content-Type', fileType);
req.setHeader('Content-Length',String.valueOf(base64.length()));
req.setHeader('Content-Transfer-Encoding', 'base64');
req.setBody(base64);
HttpResponse res = (new Http()).send(req);
File file = (File) JSON.deserialize(res.getBody(), File.class);
return file;

base64 -- строка, полученная после прочтения файла из JS. fileType -- свойсто объекта File

Дашборд в консоли молчит на предмет ошибок, и файл можно достать через "../files"

Язык программирования -- Apex от Salesforce, но думаю, синтаксис читабелен

READ ALSO
Скрытие меню при скроле

Скрытие меню при скроле

Есть появление меню при клике

123
помогите решить проблему с scrollBehavior vue js

помогите решить проблему с scrollBehavior vue js

у меня на странице с ограничением 20 новости, есть кнопка "загрузить еще" и когда нажимаешь на него показывает еще 20 новостей, но когда заходишь...

111
проблема c Fullpage

проблема c Fullpage

Сделал сайт и добавил в него библиотеку FullpageПроблема в следующем,при разрешении 16:9 все нормально

124
Выполнение функции один раз для каждого элемента

Выполнение функции один раз для каждого элемента

У меня есть несколько блоков с анимированными счетчиками (блоки с animated-block-1, animated-block-2, animated-block-3 и тд

118