ftp 不识别中文/传送中文文件失败的原因和解决方案

在尝试使用FTP下载包含中文名的文件时遇到问题,由于Linux服务器不识别中文编码,导致文件下载失败。解决方案是调整客户端的下载策略,通过修改FTP调用方法,解决了中文文件名无法识别的问题。
摘要由CSDN通过智能技术生成



此方法无效,正在解决





借用了别人的c#代码做ftp,发现该ftp传输文件时不能下载带有中文名的文件。服务器是linux服务器不识别中文,客户端是win8。

这种问题是由客户端中文编码与服务器编码不一致造成的,要么让服务器识别中文编码,要么让客户端“聪明”些改变下载策略。

本人尝试前者数次,奈何水平不够,至今未能修改linux系统语言,只好尝试后者。

修改前该ftp调用方法如下:


FtpWeb ftp = new FtpWeb("115.77.365.99","/var/ftp/test1","test1","553569");
 ftp.Download("d:", @"1.txt");

即可将文件"1.txt" 从服务器的/var/ftp/test1目录下下载至本地的"d:"目录下

然而在服务器上将“1.txt”改为"去.txt"之后就不能下载了,在服务器上文件名显示为“??.txt”

本人最终使用了两条语句来解决这个问题:

  public static string z百分号变汉字(string aa)  //GBK编码转换成汉字,如把"%c8%a5.txt"变成"去.txt" (c8 a5,不一定对应的就是“去”这个字,记不清//了)
        {
            return aa= System.Web.HttpUtility.UrlDecode(aa, System.Text.Encoding.GetEncoding("GB2312"));
        }
  public static string z汉字变百分号(string aa) //汉字变成“%c8%a5.txt”这种类型 
        {
           return aa = System.Web.HttpUtility.UrlEncode(aa, Encoding.GetEncoding("GBK"));
        
        }

具体的原理也不甚清楚,求解释,全部代码及调用方式如下(借用的别人的程序,版权不是俺的,俺也不清楚哪里是最早的出处):

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Net;

using System.Windows.Forms;

using System.Globalization;

using System.Web;


/*
 调用方法
 FtpWeb ftp = new FtpWeb("333.22.111.22","/var/ftp/test1","test1","553569");
 ftp.Download("d:", @"去.txt");
 */





namespace FtpLib
{



    public class FtpWeb
    {

        string ftpServerIP;

        string ftpRemotePath;

        string ftpUserID;

        string ftpPassword;

        string ftpURI;

        public static string z百分号变汉字(string aa)
        {
            return aa= System.Web.HttpUtility.UrlDecode(aa, System.Text.Encoding.GetEncoding("GB2312"));
        }
        public static string z汉字变百分号(string aa)
        {
           return aa = System.Web.HttpUtility.UrlEncode(aa, Encoding.GetEncoding("GBK"));
        
        }


        /// <summary>

        /// 连接FTP

        /// </summary>

        /// <param name="FtpServerIP">FTP连接地址</param>

        /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>

        /// <param name="FtpUserID">用户名</param>

        /// <param name="FtpPassword">密码</param>

        public FtpWeb(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword)
        {
         
            //修改
            FtpRemotePath = z汉字变百分号(FtpRemotePath);

            //修改结束
            ftpServerIP = FtpServerIP;

            ftpRemotePath = FtpRemotePath;

            ftpUserID = FtpUserID;

            ftpPassword = FtpPassword;

            ftpURI =@"ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";

        }



        /// <summary>

        /// 上传

        /// </summary>

        /// <param name="filename"></param>

        public void Upload(string filename)
        {

            FileInfo fileInf = new FileInfo(filename);

            string uri = ftpURI + fileInf.Name;

            FtpWebRequest reqFTP;



            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

            reqFTP.KeepAlive = false;

            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;

            reqFTP.UseBinary = true;

            reqFTP.ContentLength = fileInf.Length;

            int buffLength = 2048;

            byte[] buff = new byte[buffLength];

            int contentLen;

            FileStream fs = fileInf.OpenRead();

            try
            {

                Stream strm = reqFTP.GetRequestStream();

                contentLen = fs.Read(buff, 0, buffLength);

                while (contentLen != 0)
                {

                    strm.Write(buff, 0, contentLen);

                    contentLen = fs.Read(buff, 0, buffLength);

                }

                strm.Close();

                fs.Close();

            }

            catch (Exception ex)
            {

         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值