我似乎无法通过HttpResponseMessage
中的Web API设置zip文件的名称。我可以使用ZipArchive及其所有内容文件成功创建zip文件,但是从客户端下载时(尽管确实返回并成功打开),该名称会以16字节十六进制格式(如guid)出现。我想为我的zip文件设置一个自定义名称。我应该在哪里做?
设置ContentDisposition
不起作用:
responseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = attachmentName
};
从客户端使用Angular2 +,我将该文件作为blob返回:
DownloadAtachment(url: string): Observable<Blob> {
const requestHeaders = new Headers(
{
'Content-Type', 'application/json',
'Accept', 'application/zip'
},
);
let options = new RequestOptions({ headers: requestHeaders });
let args: RequestOptionsArgs = {headers: options, withCredentials:false, responseType: ResponseContentType.ArrayBuffer};
return this._http.get(url, args)
.map(response => {
return new Blob([response.blob()], { type: 'application/zip'});
});
}
答案 0 :(得分:1)
我建议使用file-saver
js库(请检查Angular 2 Best approach to use FileSaver.js)或ngx-filesaver
,更多信息请参见https://www.npmjs.com/package/ngx-filesaver
答案 1 :(得分:1)
我仍然不确定为什么不使用HttpResponseMessage标头,但是我只是使用了另一种方式来处理响应。因此,不要使用以下命令来打开Blob:
const fileurl = URL.createObjectURL(res);
window.open(fileurl, '_self');
我使用@ViewChild
访问了一个不可见的定位标记来处理点击并设置附件名称:
const fileurl = URL.createObjectURL(res);
const link = this.zipClick.nativeElement as HTMLAnchorElement;
link.href = fileurl;
link.donwload = "Name.zip";
link.click();
window.URL.revokeObjectURL(fileurl);
答案 2 :(得分:0)
如果不需要使用Angular的HttpClient下载它,则可以在模板中简单地创建一个<a [href]="url" target="_blank">Download zip</a>
。也许也可以。