1

我在Content-Disposition被 mime/quoted-printable 编码但HttpContext.Current.Request.Files没有解码值时遇到文件名问题,而是得到“文件名”,例如:

=?utf-8?B?Zm9vIOKAkyBiYXIubXNn?=

它应该说“foo – bar.msg”

Wireshark 捕获的 Content-Disposition 是:

表格数据;名称=\"文件\";文件名=\"=?utf-8?B?Zm9vIOKAkyBiYXIubXNn?=\"

我的客户代码:

string address = "http://localhost/test";
string filename = "foo – bar.msg";
Stream stream = File.Open(filename, FileMode.Open);

using (HttpClient client = new HttpClient())
{
    // Create a stream content for the file
    using (MultipartFormDataContent content = new MultipartFormDataContent())
    {
        var fileContent = new StreamContent(stream);
        fileContent.Headers.ContentDisposition = 
            new ContentDispositionHeaderValue("form-data")
        {
            Name = "\"file\"",
            FileName = filename
        };
        fileContent.Headers.ContentType = 
            new MediaTypeHeaderValue("application/octet-stream");

        content.Add(fileContent);

        Uri requestAddress = new Uri(address);

        // Post the MIME multipart form data upload with the file
        HttpResponseMessage response = 
            client.PostAsync(requestAddress, content).Result;
    }
}

我的服务器代码

public void Post()
{
    // this line results in filename being set to the encoded value
    string filename = HttpContext.Current.Request.Files[0].FileName;
}

有没有办法让HttpFileCollection解码值?或者更有可能,有没有办法防止我的客户端代码对值进行双重编码?

因为内容配置位于多部分边界部分,所以我不能Request.Content.Headers.ContentDisposition按原样使用nullContentDispositionHeaderValue有没有办法从多部分表单数据请求的正文中获取实例?

4

1 回答 1

0

当尝试从具有特殊字符名称的文件中获取 FileName 时,我遇到了同样的问题,在我的情况下使用重音符号。

我的解决方案是,在服务器端:

  1. 删除这部分 =?utf-8?B? Zm9vIOKAkyBiYXIubXNn ?=
  2. 结果 Zm9vIOKAkyBiYXIubXNn 是 base64 字符串,用于Convert.FromBase64String获取 byte[] ->var myBytes = Convert.FromBase64String("Zm9vIOKAkyBiYXIubXNn");
  3. 将字节解码为 UTF8 字符串:string utf8String = Encoding.UTF8.GetString(myBytes);,您将获得原始文件名
  4. 可选:从结果字符串中删除变音符号

PD:

Esto sirve para obtener httpPostedFile.FileNamede archivos con nombre con caracteres especiales o acentos。

问候!

于 2020-02-03T07:49:11.383 回答