Случай: На платформе Salesforce я использую Google Drive для хранения файлов (изображения для этого случая) с сконфигурировано Apex Google Drive API Framework. Таким образом API-интерфейс Google Drive обрабатывает authToken и так далее. Я могу загружать и просматривать изображения в своем приложении. В моем случае я хочу выбрать несколько файлов и загрузить их в один ZIP-файл. Пока я пытаюсь это сделать, используя библиотеки JSZip
и FileSaver
. С тем же кодом ниже Я могу заархивировать и загрузить несколько файлов, хранящихся в другом месте, с соответствующим заголовком ответа, но не из GDrive из-за ошибки CORS.Как скачать несколько файлов с Диска Google в .zip с использованием JSZip на Salesforce
https://xxx.salesforce.com/contenthub/download/XXXXXXXXXX%3Afile%XXXXXX_XXXXXXXXX. No'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://xxx.visual.force.com' is therefore not allowed access.
Если бы я просто щелкнул по этой ссылке, начнется загрузка файла.
Есть ли способ настроить GDrive для включения заголовка ответа: Access-Control-Allow-Origin: *
или Access-Control-Allow-Origin: https://*/mydomain.com
каким-то образом или мне просто нужно использовать что-то еще, возможно, сжатие на стороне сервера? Теперь я использую ссылку для загрузки, предоставленную API Apex для Google Диска (выглядит так: https://xxx.salesforce.com/contenthub/download/XXXXXXXXXXX%3Afile%XXXXXXXX
), он отлично работает при использовании как src="fileURL"
или при вставке непосредственно в браузер. Разъем GDrive добавляет «accesToken» и т. Д.
Мой код:
//ajax request to get files using JSZipUtils
let urlToPromise = (url) =>{
return new Promise(function(resolve, reject) {
JSZipUtils.getBinaryContent(url, function (err, data) {
if(err) {
reject(err);
} else {
resolve(data);
}
});
});
};
this.downloadAssets =() => {
let zip = new JSZip();
//here 'selectedAssets' array of objects each of them has 'assetFiles'
//with fileURL where I have url. Download and add them to 'zip' one by one
for (var a of this.selectedAssets){
for (let f of a.assetFiles){
let url = f.fileURL;
let name = a.assetName + "." + f.fileType;
let filename = name.replace(/ /g, "");
zip.file(filename, urlToPromise(url), {binary:true});
}
}
//generate zip and download using 'FileSaver.js'
zip.generateAsync({type:"blob"})
.then(function callback(blob) {
saveAs(blob, "test.zip");
});
};
Я также попытался изменить let url = f.fileURL
к let url = f.fileURL + '?alt=media';
и &access_token=CURRENT_TOKEN
добавленным соединителем GDrive.
эта ссылка обрабатывается разъемом GRDrive, поэтому, если я просто вхожу в браузер, он загружает изображение. Однако для множественной загрузки с использованием JS я получил ошибку CORS.
Да, я ничего не нашел для загрузки нескольких файлов непосредственно из GDrive. Я пытаюсь загрузить один файл за один раз здесь 'urlToPromise = (url)' с запросом AJAX. То, что я пытаюсь сделать, это: 1. Загрузите один файл 2. Zip-файлы в одном файле (на стороне клиента с JavaScript) 3. Загрузите это 'zip' Мне нужно что-то вроде самого GDrive, где это возможно для загрузки нескольких файлов в виде zip. –