1

私はx-auth-tokenを使用して通信を維持していますが、これはAjaxリクエストでは問題ありません。 ajaxによって取得されます。x-auth-tokenを使用しているときにセキュリティで保護された静的ファイルにアクセスする

これらのファイルは、基本的にはブラウザがレンダリングできるように、CSSやフォントを使用してHTML、CSS、HTMLなどのコンテンツをアップロードしているため、ajax force downloadボタンを選択することはできません(ただし、私は考えていない)。現在、彼らはちょうど<a hrefリンク経由でブラウザGETによって要求されているので、ヘッダは含まれていません。

私はAngularJSを使用しています。この問題に対処する最善の方法は何ですか?

答えて

0

この質問は数ヶ月前ですが、最初にSpring Sessionを使用したときにAngularJSでこの問題が発生しました。ちょっとハッキリですが、基本的にAngularJSのHTTPを使用してドキュメントを取得し、ブラウザのBLOBに保存します。次に、隠した<a>タグがBLOBへのリンクと共に作成され、リンクがプログラムによってクリックされます。私はこれを扱う「saveBlob」と呼ばれるAngularJSのサービスがあります。

app.service('saveBlob', ['$http', function ($http) { 
return { 
    download: function(url, fileName) { 
     $http.get(url, { responseType: 'arraybuffer' }).then(function(response) { 
      var blob = new Blob(
        [ response.data ], 
        { type: response.headers('Content-Type') } 
       ); 
      var objUrl = window.URL.createObjectURL(blob); 
      var a = document.createElement("a"); 
      document.body.appendChild(a); 
      a.style = "display: none"; 
      a.href = objUrl; 
      if (fileName) { 
       a.download = fileName; 
      } 
      else { 
       var regex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g; 
       var match = regex.exec(response.headers('Content-Disposition')); 
       var fn = match[1]; 
       a.download = fn.substring(1, fn.length - 1); 
      } 
      a.click(); 
      window.URL.revokeObjectURL(url); 
     }); 
    } 
} 
}]); 

「saveBlob」サービスは、その後、「httpHref」と呼ばれるディレクティブによって呼び出されます。

app.directive('httpHref', ['$http', 'saveBlob', function ($http, saveBlob) { 
return { 
    link: function ($scope, elem, attrs) { 
     function revokeObjectURL() { 
      if ($scope.objectURL) { 
       URL.revokeObjectURL($scope.objectURL); 
      } 
     } 

     $scope.$watch('objectURL', function (objectURL) { 
      elem.attr('href', objectURL); 
     }); 

     $scope.$on('$destroy', function() { 
      revokeObjectURL(); 
     }); 

     attrs.$observe('httpHref', function (url) { 
      elem[0].onclick = function() { 
       saveBlob.download(url); 
      }; 
     }); 
    } 
}; 
}]); 

私は(This GitHub Repositoryからこのコードを適応しましたこれはMITライセンスの下でライセンスされています)、これを手伝ってくれたプロジェクトの貢献者に感謝します!

+0

誰かに役立つかもしれませんが、私はAureliaに移行しましたが、これをaurelia/fetch apiに変換する方法を見つけることができたと確信しています – xenoterracide

関連する問題