浏览代码

Fix non-ascii filename downloads

Follow https://tools.ietf.org/html/rfc5987#section-3.2.2 to encode
non-ascii filenames in HTTP Content-Disposition header.
Jean-Samuel Aubry-Guzzi 6 年之前
父节点
当前提交
12721eb7dd
共有 1 个文件被更改,包括 12 次插入1 次删除
  1. 12 1
      MediaBrowser.Api/Library/LibraryService.cs

+ 12 - 1
MediaBrowser.Api/Library/LibraryService.cs

@@ -2,6 +2,8 @@ using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.IO;
 using System.IO;
 using System.Linq;
 using System.Linq;
+using System.Net;
+using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using MediaBrowser.Api.Movies;
 using MediaBrowser.Api.Movies;
@@ -828,7 +830,16 @@ namespace MediaBrowser.Api.Library
             var filename = (Path.GetFileName(path) ?? string.Empty).Replace("\"", string.Empty);
             var filename = (Path.GetFileName(path) ?? string.Empty).Replace("\"", string.Empty);
             if (!string.IsNullOrWhiteSpace(filename))
             if (!string.IsNullOrWhiteSpace(filename))
             {
             {
-                headers[HeaderNames.ContentDisposition] = "attachment; filename=\"" + filename + "\"";
+                // Kestrel doesn't support non-ASCII characters in headers
+                if (Regex.IsMatch(filename, "[^[:ascii:]]"))
+                {
+                    // Manually encoding non-ASCII characters, following https://tools.ietf.org/html/rfc5987#section-3.2.2
+                    headers[HeaderNames.ContentDisposition] = "attachment; filename*=UTF-8''" + WebUtility.UrlEncode(filename);
+                }
+                else
+                {
+                    headers[HeaderNames.ContentDisposition] = "attachment; filename=\"" + filename + "\"";
+                }
             }
             }
 
 
             return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions
             return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions