如何在HttpClient/MultipartFormDataContent中禁用base64编码的文件名

Str*_*z0r 6 c# base64 dotnet-httpclient

我正在使用HttpClientPOST MultipartFormDataContent到Java Web应用程序.我正在上传几个StringContents和一个文件,我使用该方法添加为StreamContent使用.MultipartFormDataContent.Add(HttpContent content, String name, String fileName)HttpClient.PostAsync(String, HttpContent)

这工作正常,除非我提供包含德语变音符号的fileName(我还没有测试过其他非ASCII字符).在这种情况下,fileName正在进行base64编码.名为99 2 LD 353TempÄüöß-1.txt的文件的结果

看起来像这样:

 __utf-8_B_VGVtcCDvv73vv73vv73vv71cOTkgMiBMRCAzNTMgVGVtcCDvv73vv73vv73vv70tMS50eHQ___
Run Code Online (Sandbox Code Playgroud)

Java服务器在其UI中显示此编码文件名,这会使用户感到困惑.我无法进行任何服务器端更改.

如何禁用此行为?任何帮助将受到高度赞赏.

提前致谢!

小智 9

我刚刚发现了与StrezzOr相同的限制,因为我使用的服务器不尊重文件名*标准.

我将文件名转换为UTF-8表示的字节数组,并将字节重新设置为"简单"字符串(非UTF-8)的字符.

此代码创建内容流并将其添加到多部分内容:

        FileStream fs = File.OpenRead(_fullPath);
        StreamContent streamContent = new StreamContent(fs);
        streamContent.Headers.Add("Content-Type", "application/octet-stream");
        String headerValue = "form-data; name=\"Filedata\"; filename=\"" + _Filename + "\"";
        byte[] bytes = Encoding.UTF8.GetBytes(headerValue);
        headerValue="";
        foreach (byte b in bytes)
        {
            headerValue += (Char)b;
        }
        streamContent.Headers.Add("Content-Disposition", headerValue);
        multipart.Add(streamContent, "Filedata", _Filename);
Run Code Online (Sandbox Code Playgroud)

这与西班牙口音一起使用.

希望这可以帮助.

  • 请注意,不需要 multipart.Add(streamContent, "Filedata", _Filename),multipart.Add(streamContent) 就足够了。目前 multipart.Add(streamContent, "Filedata", _Filename) 将只跳过最后两个参数,因为标头已经存在,但它将来可能会发生变化(如果跳过,它将覆盖\替换)。 (2认同)

Str*_*z0r 1

我最终放弃并使用HttpWebRequest而不是解决了该任务HttpClient。我必须手动构建标头和内容,但这使我可以忽略发送非 ASCII 文件名的标准。我最终将未编码的 UTF-8 文件名塞进filename标头中,这是服务器接受我的请求的唯一方式。