为什么 ContentDisposition 的 FileName 添加了额外的斜杠和引号 + 抛出的异常?

Aya*_*lla 10 asp.net-web-api2

在此处输入图片说明

我正在尝试使用 ASP.NET WebApi2 上传文件。我正在尝试两个选项:第一个是将文件保存在内存中。为此,我使用了一段代码,它是 HttpContent 类的扩展:

public static async Task<HttpPostedData> ParseMultipartAsync(this HttpContent postedContent)
        {
            var provider = await postedContent.ReadAsMultipartAsync();

            var files = new Dictionary<string, HttpPostedFile>(StringComparer.InvariantCultureIgnoreCase);
            var fields = new Dictionary<string, HttpPostedField>(StringComparer.InvariantCultureIgnoreCase);

            string[] toegestaneExtensies = { ".jpg", ".jpeg", ".gif", ".png", ".pdf", ".txt", ".xlsx" };

            foreach (var content in provider.Contents)
            {
                var fieldName = content.Headers.ContentDisposition.Name.Trim('"');

                if (!string.IsNullOrEmpty(content.Headers.ContentDisposition.FileName))
                {
                    bool geuploadBestandHeeftToegestaneExtensie = (toegestaneExtensies.Contains(Path.GetExtension(content.Headers.ContentDisposition.FileName)));

                    if ((content.Headers.ContentLength > 0) && geuploadBestandHeeftToegestaneExtensie)
                    {
                        var file = await content.ReadAsByteArrayAsync();
                        var fileName = content.Headers.ContentDisposition.FileName.Trim('"');
                        files.Add(fieldName, new HttpPostedFile(fieldName, fileName, file));
                    }
                }
                else
                {
                    if (fieldName != "submit")
                    {
                        var data = await content.ReadAsStringAsync();
                        fields.Add(fieldName, new HttpPostedField(fieldName, data));
                    }
                }
            }

            return new HttpPostedData(fields, files);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但这会引发异常,因为 FileName 的格式不正确。我可以看到图片中的文件名是“正常的”,但是查看 ContentDisposition,文件名突然变成了“\”banana.jpg\””。为什么是这样?

我要做的第二件事是保存到磁盘。这似乎有效,我可以将文件写入磁盘,但收到以下错误消息:

“将 MIME 多部分正文部分写入输出流时出错”-“拒绝访问”。

它只是以下代码:

public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
    public CustomMultipartFormDataStreamProvider(string path) : base(path)
    {
    }

    public override string GetLocalFileName(HttpContentHeaders headers)
    {
        return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
    }
}

var streamProvider = new MultipartFormDataStreamProvider("d:/");
var t = await Request.Content.ReadAsMultipartAsync(streamProvider);
Run Code Online (Sandbox Code Playgroud)

但是没有访问被拒绝,文件被写入,以前不存在,文件有一个正常的文件名。会发生什么?

nat*_*hfy 10

错误在这里:https : //github.com/aspnet/HttpAbstractions/issues/446

解决方法是: var fileName = file.Headers.ContentDisposition.FileName.TrimStart('\"').TrimEnd('\"');

悲伤但真实


Max*_*Max 7

甚至比 nathfy 的解决方案更干净:

var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
Run Code Online (Sandbox Code Playgroud)