2016-11-19 12 views
1

Случай: На платформе 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.

ответ

0

Мой ранее опубликованный код работает. Забыл опубликовать решение. Просто вместо ссылки на концентратор контента я начал использовать прямую ссылку на Google Диск, и проблема CORS была решена. Все еще не уверен, что CORS может быть каким-то образом решена на стороне Salesforce. Пробовал разные настройки без везения. Прямая ссылка для скачивания в GDrive работает в моем случае. Единственное, что мне пришлось изменить, это префикс к ID файла GDrive.

2

Я думаю, что эта функция еще не поддерживается. Если вы проверите Download Files guide из Drive API, нет никаких упоминаний о загрузке нескольких файлов одновременно. Это связано с тем, что вы должны создавать индивидуальные запросы API для каждого файла. Это подтверждается в этом SO thread.

Но выбранные несколько файлов преобразуются в один ZIP-файл и загружают этот один ZIP-файл, который возможен с помощью API-интерфейсов Google. Итак, как я могу преобразовать их в один Zip-файл? пожалуйста скажи мне.

+0

Да, я ничего не нашел для загрузки нескольких файлов непосредственно из GDrive. Я пытаюсь загрузить один файл за один раз здесь 'urlToPromise = (url)' с запросом AJAX. То, что я пытаюсь сделать, это: 1. Загрузите один файл 2. Zip-файлы в одном файле (на стороне клиента с JavaScript) 3. Загрузите это 'zip' Мне нужно что-то вроде самого GDrive, где это возможно для загрузки нескольких файлов в виде zip. –

2

Согласно мне, просто загрузите все файлы и сохраните их во временном каталоге, а затем добавьте этот каталог в zip-файл и сохраните его на физическом устройстве.

public Entity.Result<Entity.GoogleDrive> DownloadMultipleFile(string[] fileidList) 
    { 
     var result = new Entity.Result<Entity.GoogleDrive>(); 
     ZipFile zip = new ZipFile(); 

     try 
     { 
      var service = new DriveService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = "Download File", 
      }); 

      FilesResource.ListRequest listRequest = service.Files.List(); 
      //listRequest.PageSize = 10; 
      listRequest.Fields = "nextPageToken, files(id, name, mimeType, fullFileExtension)"; 

      IList<File> files = listRequest.Execute().Files; 

      if (files != null && files.Count > 0) 
      { 
       foreach (var fileid in fileidList) 
       { 
        foreach (var file in files) 
        { 
         if (file.Id == fileid) 
         {         
           result.Data = new Entity.GoogleDrive { FileId = fileid }; 
           FilesResource.GetRequest request = service.Files.Get(fileid); 
           request.ExecuteAsync(); 
           var stream = new System.IO.FileStream(HttpContext.Current.Server.MapPath(@"~\TempFiles") + "\\" + file.Name, System.IO.FileMode.Create, System.IO.FileAccess.Write); 
           request.MediaDownloader.ProgressChanged += (IDownloadProgress progress) => 
           { 
            switch (progress.Status) 
            { 
             case DownloadStatus.Downloading: 
              { 
               break; 
              } 
             case DownloadStatus.Completed: 
              { 
               break; 
              } 
             case DownloadStatus.Failed: 
              { 
               break; 
              } 
            } 
           }; 
           request.Download(stream); 
           stream.Close(); 
           break; 
          }         
         } 
        } 

      } 
      zip.AddDirectory(HttpContext.Current.Server.MapPath(@"~\TempFiles"), "GoogleDrive"); 
      string pathUser = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 
      string pathDownload = System.IO.Path.Combine(pathUser, "Downloads"); 
      zip.Save(pathDownload + "\\GoogleDrive.zip"); 
      System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(HttpContext.Current.Server.MapPath(@"~\TempFiles")); 
      foreach (var file in di.GetFiles()) 
      { 
       file.Delete(); 
      } 

      result.IsSucceed = true; 
      result.Message = "File downloaded suceessfully"; 
     } 
     catch (Exception ex) 
     { 
      result.IsSucceed = false; 
      result.Message = ex.ToString(); 
     } 
     return result; 
    }