Safari iOS不解码asp.net web api内容处理文件名

时间:2014-07-08 09:53:13

标签: asp.net-web-api safari

我有一个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识别它?

1 个答案:

答案 0 :(得分:0)

当我添加FileNameStar而非FileName时,Mobile Safari停止使用标头中的文件名,并开始查看文件名的网址。请注意,在此代码中responseHttpResponseMessage对象。

        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很开心,所有其他浏览器仍然使用内容处理文件名。