FTP上传及下载
定义FileStream类的操作类:操作类名: FtpUpDown
上传文件
/// <summary> /// 上传文件 /// </summary> /// <param name="localpath">上传文件的全路径 例@"D:\123.txt"</param> /// <param name="ftppath"></param> /// <returns></returns> public bool Upload(string localpath, string ftppath) { bool bol = false; try { FileInfo fileInf = new FileInfo(localpath); //替换符号 ftppath = ftppath.Replace("\\", "/"); //组合ftp上传文件路径 string uri = "ftp://" + ftppath + "/" + fileInf.Name; // 根据uri创建FtpWebRequest对象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // 指定数据传输类型 reqFTP.UseBinary = true; // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); // 默认为true,连接不会被关闭 // 在一个命令之后被执行 reqFTP.KeepAlive = false; // 指定执行什么命令 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 上传文件时通知服务器文件的大小 reqFTP.ContentLength = fileInf.Length; // 缓冲大小设置为kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; // 打开一个文件流(System.IO.FileStream) 去读上传的文件 FileStream fs = fileInf.OpenRead(); try { // 把上传的文件写入流 Stream strm = reqFTP.GetRequestStream(); // 每次读文件流的kb contentLen = fs.Read(buff, 0, buffLength); // 流内容没有结束 while (contentLen != 0) { // 把内容从file stream 写入upload stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); bol = true; } // 关闭两个流 strm.Close(); fs.Close(); } catch (Exception ex) { MessageBox.Show("上传文件失败,失败原因;" + ex.Message); } } catch (Exception ex) { MessageBox.Show("上传文件失败,失败原因;" + ex.Message); } return bol; } 下载文件: /// <summary> /// 下载文件 /// </summary> /// <param name="localpath"></param> /// <param name="fileName"></param> /// <param name="errorinfo"></param> /// <returns></returns> public bool Download(string localpath, string fileName, out string errorinfo) { try { String onlyFileName = Path.GetFileName(fileName); string newFileName = localpath + "\\" + onlyFileName; if (File.Exists(newFileName)) { errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName); return false; } string url = "ftp://" + ftpServerIP + "/FileInfo/" + fileName; // 根据uri创建FtpWebRequest对象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url)); // 指定数据传输类型 reqFTP.UseBinary = true; // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); Stream ftpStream = response.GetResponseStream(); long cl = response.ContentLength; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); FileStream outputStream = new FileStream(newFileName, FileMode.Create, FileAccess.Write); while (readCount > 0) { outputStream.Write(buffer, 0, readCount); readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); errorinfo = ""; return true; } catch (Exception ex) { errorinfo = string.Format("因{0},无法下载", ex.Message); return false; } } 调用方法: /// <summary> /// 上传 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click_1(object sender, RoutedEventArgs e) { FtpUpDown ftp = new FtpUpDown(ftpServerIP, ftpUserID, ftpPassword); string localpath = @"D:\123.txt"; string ftppath = ftpServerIP + @"\FileInfo"; bool bol = ftp.Upload(localpath, ftppath); if (bol == true) MessageBox.Show("上传成功"); else MessageBox.Show("上传失败"); } /// <summary> /// 下载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button_Click_2(object sender, RoutedEventArgs e) { string errorinfo; string localpath = @"E:\qzq\FileInfo"; if (!Directory.Exists(localpath)) { Directory.CreateDirectory(localpath); } string filename = "123.txt"; if (!File.Exists(localpath + "\\" + filename)) { FtpUpDown ftp = new FtpUpDown(ftpServerIP, ftpUserID, ftpPassword); bool bol = ftp.Download(localpath, filename, out errorinfo); if (bol == true) MessageBox.Show("下载成功"); else MessageBox.Show("下载失败:" + errorinfo + ""); } else { MessageBox.Show("下载文件已存在!"); } }
其中: ftpServerIP:上传服务的IP地址。
ftpUserID: 上传服务的登录名。
ftpPassword: 上传服务的密码。