2016-11-19 9 views
1

ケース: Salesforceプラットフォームの場合Googleドライブを使用して、Apex GoogleドライブAPIフレームワークを含むファイル(このケースの画像)を保存します。そのため、GoogleドライブAPIはauthTokenなどを処理します。私は自分のアプリケーションで画像をアップロードし閲覧することができます。私の場合、複数のファイルを選択して1つのzipファイルでダウンロードしたいと考えています。今のところ私はJSZipFileSaverのライブラリを使ってそれをしようとしています。同じコードを以下のとすると、適切な応答ヘッダーを使用して別の場所に保存された複数のファイルを圧縮してダウンロードできますが、CORSエラーのためGDriveからはダウンロードできません。SalesforceでJSZipを使用してGoogleドライブから複数のファイルをダウンロードする方法

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ドライブ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 + '?alt=media';とGDriveコネクタによって追加&access_token=CURRENT_TOKENlet url = f.fileURLを変更しようとしました。

このリンクはGRDriveコネクタで処理されますので、ブラウザに入力すれば画像がダウンロードされます。しかし、JSを使用して複数回ダウンロードすると、CORSエラーが発生します。

答えて

0

以前に公開されたコードが動作します。解決策を投稿するのを忘れました。 コンテンツハブリンクを使用する代わりにGoogleドライブへの直接リンクを使用し始め、CORSの問題が解決されました。 CORSがSalesforce側で何とか解決されるかどうかはまだ分かりません。運がない別のセットアップを試しました。 私の場合、GDriveへの直接ダウンロードリンクは正常に動作します。変更しなければならないのは、GDriveファイルIDの接頭辞です。

2

この機能はまだサポートされていないと思います。ドライブAPIからDownload Files guideを確認すると、一度に複数のファイルをダウンロードするという言葉はありません。これは、各ファイルに対して個別のAPIリクエストを作成する必要があるためです。これはこのSO threadで確認されています。

しかし、選択した複数のファイルは1つのzipファイルに変換され、GoogleドライブAPIで可能な1つのzipファイルをダウンロードします。では、どうすればそれらを単一のZipファイルに変換できますか?教えてください。

+0

私はGDriveから複数のファイルを直接ダウンロードすることはできませんでした。私はAJAXリクエストでここで一度に一つのファイルをダウンロードしようとしています。 'urlToPromise =(url)'。私がしようとしていることは次のとおりです: 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; 
    } 
関連する問題