PowerShell中Invoke-RestMethod发送含特殊字符文件名的乱码问题
解决PowerShell发送含特殊字符文件名的乱码问题
你的问题是文件名中的特殊字符(äöü)在HTTP传输后出现乱码,本质是编码不匹配:PowerShell默认用系统编码传递文件名,而服务端期望UTF-8编码,导致äöü被错误解析为äöü。
修复步骤
1. 修正代码语法错误
原代码中$fileName=testäöü.csv缺少引号,会触发语法错误,先补上:
$fileName="testäöü.csv"
2. 手动指定UTF-8编码传递文件名
通过构造符合RFC 5987标准的Content-Disposition HTTP头,明确告诉服务端文件名使用UTF-8编码。修改后的完整代码:
$exportPath="C:\test\" $fileName="testäöü.csv" $originalFilePath = Join-Path -Path $exportPath -ChildPath $fileName $zipFileName = [System.IO.Path]::ChangeExtension($fileName, ".zip") $zipFilePath = Join-Path -Path $exportPath -ChildPath $zipFileName Compress-Archive -Path $originalFilePath -DestinationPath $zipFilePath -Update # 生成UTF-8编码的文件名HTTP头 $encodedFileName = [System.Web.HttpUtility]::UrlEncode($zipFileName, [System.Text.Encoding]::UTF8) $headers = @{ "Content-Disposition" = "attachment; filename*=UTF-8''$encodedFileName" } Invoke-RestMethod -Credential $Credential -Uri $RestRequest -Method PUT -InFile $zipFilePath -ContentType "application/zip" -Headers $headers
关键解释
filename*=UTF-8''是标准格式,明确声明文件名的编码为UTF-8UrlEncode将特殊字符转换为UTF-8的URL编码格式,确保传输过程中不会出现编码丢失- 服务端只要遵循HTTP标准,就能正确解码还原出原始文件名
额外验证
如果修改后仍有问题,需要确认服务端是否支持RFC 5987的filename*语法,大部分现代Web框架(如Spring、ASP.NET)都默认支持。
内容的提问来源于stack exchange,提问作者xtoff
相关产品推荐
相关产品推荐

