Случай: на платформе Salesforce я использую Google Диск для хранения файлов (в данном случае изображений) с настроенной Apex Google Drive API Framework. Таким образом, Google Drive API обрабатывает authToken и так далее. Я могу загружать и просматривать изображения в своем приложении. В моем случае я хочу выбрать несколько файлов и загрузить их одним zip-файлом. Пока я пытаюсь сделать это, используя библиотеки JSZip
и FileSaver
. С тем же кодом ниже я могу заархивировать и загрузить несколько файлов, хранящихся где-то еще, с правильным заголовком ответа, но не с GDrive из-за ошибки CORS.
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
каким-то образом, или мне просто нужно использовать что-то еще, может быть, сжатие на стороне сервера? Теперь я использую ссылку для загрузки, предоставленную Apex Google Drive API (выглядит так: 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.