私はClosedXMLで作成したファイルをダウンロードしようとしています。ファイルが壊れていないことを確認しましたが、何らかの理由でAngular2ではなくAngular1だけで動作します。ファイルを返すためのWeb APIコードは次のとおりです。Angular2でAngular2のダウンロードはWeb APIからファイルが壊れています、ファイルが壊れています
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new ByteArrayContent(ms.GetBuffer());
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
return response;
、私のウェブサービスに:
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('responseType', 'arrayBuffer');
this.observableDataGet = this._http.post(`${AppSettings.REPORTS_API_URL}/Report/MonthlySpreadsheet`, {headers: this.getHeaders()})
.map(response => {
if (response.status == 400) {
return "FAILURE";
} else if (response.status == 200) {
var contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
var blob = new Blob([response.arrayBuffer()], { type: contentType });
return blob;
}
})
と私のコンポーネントで:
.subscribe(blob => {
var downloadUrl= URL.createObjectURL(blob);
window.open(downloadUrl);
},
ファイルがダウンロードされますが、アクセスしようとすると壊れてしまい、Angular1でダウンロードしたときにファイルのサイズは2倍になります。
Angular1でSAME APIを呼び出すと、ファイルが正常にダウンロードされます。
マイサービスコード:
alertAppService.generateMonthlySpreadsheet(header).then(function (data){
var blob = new Blob([data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
var objectUrl = URL.createObjectURL(blob);
window.open(objectUrl);
:handleSuccessがサービスを呼び出すために(私はangular2のために取得することはできません)response.data
とコードを返す
function generateMonthlySpreadsheet(header) {
var request = $http({
method: "post",
responseType: 'arraybuffer',
url: TEST_API_URL + 'Report/MonthlySpreadsheet',
timeout: 30000,
headers: header
});
return (request.then(handleSuccess, handleError));
}
興味深いことに、Angular2では、単に私のWebサービスをGETに変更した場合(私はPOSTを望んでいましたが、試してみたい)、サービスコードを取り除いて、単にこの呼び出しを行った場合、fiルで結構です:だから
window.open(`${AppSettings.REPORTS_API_URL}/Report/MonthlySpreadsheet`, "_blank");
、本当に、ここでの違いは何ですか?同じまたは非常に似たコードがAngular1では動作しますが、Angular2では動作しないのはなぜですか?
- カレン