Safari 的下载文件名无法打印瑞典字符
Downloaded filename for Safari can't print swedish characters
我的 SPA 中有一个函数可以向我们在 Microsoft Azure 中的服务端点发送请求,请求一个文件(在本例中为 PDF)。
下载此文件会导致文件名称变成为 MacOS 上的 Safari 编码,如果我错了请更正我。
我了解到 Safari 或 MacOS 使用 UTF8,在 Windows 机器上用 .net 框架编写的字符串将是 UTF16,但出于测试目的,我将文件名直接写入 ContentDispositionHeaderValue
,代码示例如下:
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(data)
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "Brännoljegatan 4.pdf",
CreationDate = DateTimeOffset.UtcNow
};
现在使用我的 SPA,请求此文件将输出如下:
Chrome: "Brännoljegatan 4.pdf"
Safari: =?utf-8?B?QnLDpG5ub2xqZWdhdGFuIDQucGRm?=
string fileName = Uri.EscapeDataString("Brännoljegatan 4.pdf");
result.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName,
CreationDate = DateTimeOffset.UtcNow
};
上面的代码将导致:
Chrome: "Brännoljegatan 4.pdf"
Safari:Br%C3%A4nnoljegatan%204.pdf"
我真的不知道如何继续为 Safari 获取正确的文件名。
我们的浏览器目标是:
- 基于 Chromium(Chrome、MS Edge)
- Internet Explorer 11
- 野生动物园
遗憾的是,Safari 是迄今为止唯一的害群之马。
我希望为 Safari 将下载的文件命名为“Brännoljegatan 4.pdf”,当然还有其余的瑞典字符(å Å、ä Ä、ö Ö)
你有什么建议吗?
在 canton7 的帮助和周末休息的帮助下,我能够为我的代码解决这个问题。
我没有使用 Response.AddHeaders()
,而是使用了 Headers.Add()
.
我的 result
是 HttpResponseMessage
并使用 .NET Framework 4.7。
string fileName = "Brännoljegatan 4.pdf";
string mediaType = "application/pdf";
string contentDisposition;
contentDisposition = "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
result.Content.Headers.Add("Content-Disposition", contentDisposition);
result.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
我的 SPA 中有一个函数可以向我们在 Microsoft Azure 中的服务端点发送请求,请求一个文件(在本例中为 PDF)。 下载此文件会导致文件名称变成为 MacOS 上的 Safari 编码,如果我错了请更正我。
我了解到 Safari 或 MacOS 使用 UTF8,在 Windows 机器上用 .net 框架编写的字符串将是 UTF16,但出于测试目的,我将文件名直接写入 ContentDispositionHeaderValue
,代码示例如下:
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(data)
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "Brännoljegatan 4.pdf",
CreationDate = DateTimeOffset.UtcNow
};
现在使用我的 SPA,请求此文件将输出如下:
Chrome: "Brännoljegatan 4.pdf"
Safari: =?utf-8?B?QnLDpG5ub2xqZWdhdGFuIDQucGRm?=
string fileName = Uri.EscapeDataString("Brännoljegatan 4.pdf");
result.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = fileName,
CreationDate = DateTimeOffset.UtcNow
};
上面的代码将导致:
Chrome: "Brännoljegatan 4.pdf"
Safari:Br%C3%A4nnoljegatan%204.pdf"
我真的不知道如何继续为 Safari 获取正确的文件名。 我们的浏览器目标是:
- 基于 Chromium(Chrome、MS Edge)
- Internet Explorer 11
- 野生动物园
遗憾的是,Safari 是迄今为止唯一的害群之马。
我希望为 Safari 将下载的文件命名为“Brännoljegatan 4.pdf”,当然还有其余的瑞典字符(å Å、ä Ä、ö Ö)
你有什么建议吗?
在 canton7 的帮助和周末休息的帮助下,我能够为我的代码解决这个问题。
我没有使用 Response.AddHeaders()
,而是使用了 Headers.Add()
.
我的 result
是 HttpResponseMessage
并使用 .NET Framework 4.7。
string fileName = "Brännoljegatan 4.pdf";
string mediaType = "application/pdf";
string contentDisposition;
contentDisposition = "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
result.Content.Headers.Add("Content-Disposition", contentDisposition);
result.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);