首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# 将本地文件上传到ftp上,执行using (Stream rs = ftp.GetRequestStream()),出错:远程服务器返回异常: (550)

2013-07-04 
C# 将本地文件上传到ftp上,执行using (Stream rs ftp.GetRequestStream()),出错:远程服务器返回错误: (5

C# 将本地文件上传到ftp上,执行using (Stream rs = ftp.GetRequestStream()),出错:远程服务器返回错误: (550)
 /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="fileinfo">需要上传的文件</param>
    /// <param name="targetDir">目标路径</param>
    /// <param name="hostname">ftp地址</param>
    /// <param name="username">ftp用户名</param>
    /// <param name="password">ftp密码</param>
    public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
    {
        //1. check target
        string target;
        if (targetDir.Trim() == "")
        {
            return;
        }
        target = Guid.NewGuid().ToString();  //使用临时文件名


        string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
      
        ///WebClient webcl = new WebClient();
        System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);

        //设置FTP命令 设置所要执行的FTP命令,
        //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表
        ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
        //指定文件传输的数据类型
        ftp.UseBinary = true;
        ftp.UsePassive = true;

        //告诉ftp文件大小
        ftp.ContentLength = fileinfo.Length;
        //缓冲大小设置为2KB
        const int BufferSize = 2048;
        byte[] content = new byte[BufferSize - 1 + 1];


        int dataRead;

        //打开一个文件流 (System.IO.FileStream) 去读上传的文件
        using (FileStream fs = fileinfo.OpenRead())
        {
            try
            {
                              //把上传的文件写入流
                using (Stream rs = ftp.GetRequestStream())                {
                    do
                    {
                        //每次读文件流的2KB
                        dataRead = fs.Read(content, 0, BufferSize);
                        rs.Write(content, 0, dataRead);
                    } while (!(dataRead < BufferSize));
                    rs.Close();
                }

            }
            catch (Exception ex) { }
            finally
            {
                fs.Close();
            }

        }

        ftp = null;
        //设置FTP命令
        ftp = GetRequest(URI, username, password);


        ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名
        ftp.RenameTo = fileinfo.Name;
        try
        {
            ftp.GetResponse();
        }
        catch (Exception ex)
        {
            ftp = GetRequest(URI, username, password);
            ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //删除
            ftp.GetResponse();
            throw ex;
        }
        finally
        {
            //fileinfo.Delete();
        }

        // 可以记录一个日志  "上传" + fileinfo.FullName + "上传到" + "FTP://" + hostname + "/" + targetDir + "/" + fileinfo.Name + "成功." );
        ftp = null;

        #region
        /*****
             *FtpWebResponse
             * ****/
        //FtpWebResponse ftpWebResponse = (FtpWebResponse)ftp.GetResponse();
        #endregion
    }

我是这样调用的
    
                FileInfo fileinfo = new FileInfo(@"C:\Temp" + tcardID.Value + ".jpg");
             
                string targetDir = "image";
                string hostname = "192.168.2.3:22";
                string username = "public";


                string password = "";
                string photourl = "";
                UploadFile(fileinfo, targetDir, hostname, username, password);

到那边就出现错误了:远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。
另外,那个taget临时文件的作用是什么?
[解决办法]
FTP实现问题可以参考下面的博客的实现:
http://www.cnblogs.com/zhili/archive/2012/10/18/FTPServer.html

热点排行