使用powershell上传文件到FTP,在GB2312中使用url名称,而不是UTF-8模式

时间:2017-07-14 10:37:37

标签: powershell encoding ftp gb2312

我想写一个测试脚本上传文件到ftp,我的系统是窗口7.当我使用Windows资源管理器观看FTP时,所有中文都在错误的Charactor.Using firefox观看,在GBK encode.all文件'名字是对的。现在我想以GBK编码名称上传文件,因此Firefox会看到所有名称都正确。这就是我的意思:

$coder1= [system.Text.encoding]::GetEncoding('GB2312')
$coder2 = [system.Text.encoding]::UTF8

$user = "test"
$password = "test"
$ftp = 'ftp://10.10.10.253/shzx/'
$souce = '新建文本文档.txt'
$loacalfile = Get-Item w:\test\新建文本文档.txt
$souce1 = [system.Web.HttpUtility]::UrlEncode($souce,$coder1)
$encodeA = $ftp+$souce


$request = [system.Net.FtpWebRequest]::Create($encodeA)
$request = [system.Net.FtpWebRequest]$request
$request.Method=[system.Net.WebRequestMethods+FTP]::uploadfile
$request.Credentials = New-Object system.Net.NetworkCredential($user,$password)
$request.UseBinary = $true
$request.UsePassive = $true

$dest = $request.GetRequestStream()
$src = [system.IO.File]::OpenRead($loacalfile)
$buffsize = [system.Math]::Min($src.length , 4096)
$buff = New-Object system.Byte[] $buffsize

$numbuffloaded = 0
$byteread = 0

do
{
   $byteread = $src.read($buff,0,$buffsize)
   $dest.write($buff,0,$buffsize)
   $numbuffloaded ++
}
while($byteread -ne 0)

$dest.close()
$src.close()

$response = $request.GetResponse()

我上传测试文件后,名称不对。无论是使用firefox进行UTF8还是GBK编码都可以观看。我猜FTP服务器认为我的编码网址仍然是UTF8。因此它错误解码。如果我使用UTF8编码URL上传,当我在UTF8中设置Firefox编码时,至少FTP文件名是正确的。 有没有办法使FTP服务器解码正确?我应该设置ftpwebrequest.Headers吗?

1 个答案:

答案 0 :(得分:0)

您无法选择与FtpWebRequest一起使用的编码。

FtpWebRequest在开始连接时向服务器发送OPTS utf8 on命令。

如果服务器响应正常,FtpWebRequest将使用UTF-8。如果没有,FtpWebRequest将使用本地Windows旧版字符集。

所以你可以用它来将本地遗留字符集设置为GB2312936?)。假设服务器对OPTS utf8 on做出负面回应。