我有一个web api控制器,它返回一个.xlsx文件。我在标题中添加文件名,如下所示:
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
CreationDate = DateTime.Now,
FileName = wbName
};
在Chrome中,它会显示如下:
Content-Disposition:attachment; creation-date="Tue, 08 Jul 2014 09:43:50 GMT"; filename="=?utf-8?B? VW5rbm93biBXb3Jkcy1EZWNhcGl0YXRlZCBjaGFpbnNhdyBtdXJkZXIg4oCYdmljdGlt4oCZIG1heSBoYXZlIGtpbGxlZCBoaW1zZWx mLCBjbGFpbXMgbGF3eWVyLTA4LzA3LzIwMTQgMTM6NDM6NTAueGxzeA==?="
但是,当我在Safari iOS中下载文件时,它不会解码文件名,它只是使用巨大的编码字符串作为文件名。我将尝试将文件名添加到网址,看看是否有效,但我想我会在这里提出想法。如何设置文件名以便Safari iOS识别它?
答案 0 :(得分:0)
当我添加FileNameStar
而非FileName
时,Mobile Safari停止使用标头中的文件名,并开始查看文件名的网址。请注意,在此代码中response
是HttpResponseMessage
对象。
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
CreationDate = DateTime.Now,
// FileName = wbName,
FileNameStar = wbName
};
为了完整性,这是FileNameStar
在标题中返回的内容,即the standard
Content-Disposition:attachment; creation-date="Tue, 08 Jul 2014 12:56:05 GMT"; filename*=utf- 8''Unknown%20Words-Decapitated%20chainsaw%20murder%20%E2%80%98victim%E2%80%99%20may%20have%20killed%20himself%2C%20claims%20lawyer-08%2F07%2F2014%2012%3A56%3A03.xlsx
所以我开始研究如何在响应URL中获取文件名。这就是诀窍
UriBuilder ub = new UriBuilder(Request.RequestUri);
ub.Path = fileName; // you should clean this up first eg no spaces or encode it
response.Headers.Location = ub.Uri;
这会切断路径中的所有内容,只返回带有文件名的基本URL,例如mydomain.com/filename.txt。这就行了,现在看起来Safari iOS很开心,所有其他浏览器仍然使用内容处理文件名。