VC文件上传和下载(FTP实现)
- 格式:doc
- 大小:26.50 KB
- 文档页数:2
VB实现SFTP下载和上传的功能背景 因为安全原因,需要SFTP协议(sftp是Secure File Transfer Protocol的缩写,安全。
可以为传输⽂件提供⼀种安全的加密⽅法。
sftp 与ftp 有着⼏乎⼀样的语法和功能。
SFTP 为的⼀部份,是⼀种传输档案⾄ Blogger 伺服器的安全⽅式。
其实在SSH软件包中,已经包含了⼀个叫作SFTP(Secure File Transfer Protocol)的安全⽂件传输⼦系统,SFTP本⾝没有单独的,它必须使⽤sshd守护进程(号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像⼀个程序,⽽更像是⼀个客户端程序。
SFTP同样是使⽤加密传输认证信息和传输的数据,所以,使⽤SFTP是⾮常安全的。
但是,由于这种传输⽅式使⽤了加密/,所以⽐普通的要低得多,如果您对⽹络安全性要求更⾼时,可以使⽤SFTP代替FTP)准备阶段 需要引⽤第三⽅类库Tamir.SharpSSH.dll。
链接地址()我下载的是(Download binaries: )⽂件 把Tamir.SharpSSH.dll加载到项⽬中。
实现阶段 增加⼀个类SFTPHelper1Imports Tamir.SharpSsh.jsch23Public Class SFTPHelper4Private m_session As Session5Private m_channel As Channel6Private m_sftp As ChannelSftp78Public Sub New(ByVal host As String, ByVal user As String, ByVal pwd As String)9Dim arr() As String = host.Split(":")10Dim ip As String = arr(0)11Dim port As Integer = 2212If (arr.Length > 1) Then13 port = Int32.Parse(arr(1))14End If1516Dim jsch As JSch = New JSch()17 m_session = jsch.getSession(user, ip, port)18Dim ui As MyUserInfo = New MyUserInfo()19 ui.setPassword(pwd)20 m_session.setUserInfo(ui)21End Sub2223'SFTP获取⽂件24Public Function GetInfo(ByVal remotePath As String, ByVal localPath As String) As Boolean25Try26Dim src As Tamir.SharpSsh.java.String = New Tamir.SharpSsh.java.String(remotePath)27Dim dst As Tamir.SharpSsh.java.String = New Tamir.SharpSsh.java.String(localPath)28 m_sftp.get(src, dst)29Return True30Catch31Return False32End Try33End Function34'SFTP连接状态35Public Property Connected As Boolean36Get37Return m_session.isConnected()38End Get39Set(ByVal value As Boolean)4041End Set42End Property4344'连接SFTP45Public Function Connect() As Boolean46Dim flag As Boolean = False47Try48If (Not Connected()) Then49 m_session.connect()50 m_channel = m_session.openChannel("sftp")51 m_channel.connect()52 m_sftp = m_channel53 flag = True54End If55Catch56 flag = False57End Try58Return flag59End Function6061'断开SFTP62Public Sub Disconnect()6364If (Connected()) Then65 m_channel.disconnect()66 m_session.disconnect()67End If68End Sub6970'登录验证信息71Public Class MyUserInfo72Implements UserInfo7374Dim passwd As String7576Public Sub setPassword(ByVal ppasswd As String)77 passwd = ppasswd78End Sub79Public Function getPassphrase() As String Implements erInfo.getPassphrase80Return Nothing81End Function82Public Function getPassword() As String Implements erInfo.getPassword83Return passwd84End Function8586Public Function promptPassphrase(ByVal message As String) As Boolean Implements erInfo.promptPassphrase87Return True88End Function89Public Function promptPassword(ByVal message As String) As Boolean Implements erInfo.promptPassword90Return True91End Function92Public Function promptYesNo(ByVal message As String) As Boolean Implements erInfo.promptYesNo93Return True94End Function95Public Sub showMessage(ByVal message As String) Implements erInfo.showMessage9697End Sub98End Class99100End Class 这⾥我只实现了下载的功能,上传的功能修改后加上。
文件传输协议书有什么作用文件传输协议(File Transfer Protocol,简称FTP)是一种用于在网络上进行文件传输的协议。
它定义了一套标准的规则和约定,以确保文件的高效、安全和可靠传输。
FTP在电脑和服务器之间实现文件传输,并且是互联网中最为常用的文件传输协议之一。
以下是FTP协议的主要作用:1. 文件上传和下载:FTP协议允许用户将文件从本地计算机上传到服务器,并从服务器下载文件到本地计算机。
这使得用户可以方便地在自己的计算机上进行编辑和处理文件,并通过网络与其他计算机共享文件。
2. 目录操作:FTP协议允许用户对服务器上的文件进行目录操作,例如创建、删除和重命名目录,以及移动和复制文件。
这为用户提供了组织和管理文件的灵活性和便利性。
3. 文件权限和安全性:FTP协议通过定义不同的用户权限和访问控制机制,确保文件传输的安全性和可靠性。
用户可以设置文件的读写权限,以限制其他用户对文件的访问,并可以使用用户名和密码进行身份验证,以确保只有授权的用户才能访问和传输文件。
4. 支持断点续传:FTP协议支持断点续传功能,即在文件传输过程中,如果传输中断或失败,用户可以重新连接到服务器,并从上一次中断的位置继续传输文件,而无需重新传输整个文件。
这大大提高了文件传输的效率和可靠性。
5. 批量操作和自动化:FTP协议支持批量文件传输和自动化操作。
用户可以编写脚本或使用专门的软件工具来自动执行文件上传、下载和其他文件操作,从而大大减少了人工操作的工作量和时间。
6. 兼容性和可扩展性:FTP协议是互联网标准化的协议之一,几乎所有操作系统和网络设备都支持FTP协议。
此外,FTP协议还支持扩展功能,如FTP over SSL/TLS(FTPS)和SSH File Transfer Protocol(SFTP),以提供更高的安全性和加密传输。
7. 云存储和备份:许多云存储提供商使用FTP协议作为文件传输的方案,允许用户将文件上传到云端存储空间,并从任何地点和任何设备上下载和访问这些文件。
VC实现文件上传下载(FTP)//连接ftp服务器void CMyFtpDlg::OnConnect(){UpdateData(TRUE);//新建对话m_pInetSession=new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_AC CESS);try{//新建连接对象m_pFtpConnection=m_pInetSession-> GetFtpConnection(m_strServer,m_strUserName, m_strPassword);}catch(CInternetException *pEx){//获取错误TCHAR szError[1024];if(pEx-> GetErrorMessage(szError,1024))AfxMessageBox(szError);elseAfxMessageBox( "There was an exception ");pEx-> Delete();m_pFtpConnection=NULL;return;}m_pRemoteFinder = new CFtpFileFind(m_pFtpConnection);//获得服务器根目录的所有文件并在列表框中显示BrowseDir( " ",&m_ctrlRemoteFiles,m_pRemoteFinder,&m_arrRemoteFiles);}//下载单个文件void CMyFtpDlg::DownFile(FILEITEM fileItem){if(fileItem.bDir == TRUE){AfxMessageBox( "本程序暂时不支持下载整个文件夹,请选择文件下载 ");}else{//格式化文件名CString strLocalFile,strRemoteFile;strRemoteFile.Format( "%s\\%s ",m_pRemoteFinder-> GetRoot(),fileItem.strFileName);strLocalFile.Format( "%s\\%s ",m_LocalFinder.GetRoot(),fileItem.strFileName);//下载if(m_pFtpConnection-> GetFile(strLocalFile,strLocalFile)){CString strMsg;strMsg.Format( "下载文件%s成功! ",fileItem.strFileName);AfxMessageBox(strMsg);}}}//上传单个文件void CMyFtpDlg::UpFile(FILEITEM fileItem){if(fileItem.bDir == TRUE){AfxMessageBox( "本程序暂时不支持上载整个文件夹,请选择文件上载 ");}else{//格式化文件名CString strLocalFile,strRemoteFile;strRemoteFile.Format( "%s\\%s ",m_pRemoteFinder-> GetRoot(),fileItem.strFileName);strLocalFile.Format( "%s\\%s ",m_LocalFinder.GetRoot(),fileItem.strFileName);//上传if(m_pFtpConnection-> PutFile(strLocalFile,strLocalFile)){CString strMsg;strMsg.Format( "上载文件%s成功! ",fileItem.strFileName);AfxMessageBox(strMsg);}}}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
FTPvsTFTP协议对比文件传输的功能与性能比较文件传输协议(File Transfer Protocol,FTP)以及Trivial File Transfer Protocol(TFTP)是常用的文件传输协议。
它们都提供了在网络中传输文件的功能,但在功能和性能方面存在一些区别。
本文将对FTP和TFTP这两种协议进行比较,探讨它们的异同点。
一、FTP协议FTP是一种在计算机网络中用于文件传输的协议。
它基于客户端/服务器的体系结构,使用TCP作为传输层协议。
FTP协议提供了多种功能,包括文件上传、下载、文件夹操作以及权限管理等。
1. 功能方面:a) 文件上传和下载:FTP允许用户在客户端和服务器之间进行文件的上传和下载。
通过FTP客户端,用户可以将文件从本地计算机上传到远程服务器或者从远程服务器下载到本地计算机。
b) 目录操作:FTP支持用户对远程服务器上的目录进行操作,包括创建、删除和重命名目录等。
c) 权限管理:FTP允许用户管理远程服务器上的文件和目录的权限,包括读、写和执行等权限。
d) 恢复功能:FTP支持断点续传,即在传输过程中如果发生中断,可以从中断的地方继续传输。
2. 性能方面:FTP协议的性能受到多个因素影响,包括网络带宽、延迟、服务器负载等。
通常情况下,FTP协议具有较高的传输速率,适用于大文件的传输。
然而,由于其基于TCP协议,传输速率可能受到网络拥塞和丢包等因素的影响。
二、TFTP协议TFTP是一种简化的文件传输协议,它比FTP协议更简单并且使用UDP作为传输层协议。
TFTP协议的设计目标是快速、小巧和易实现。
1. 功能方面:a) 文件上传和下载:TFTP允许用户在客户端和服务器之间进行文件的上传和下载,类似于FTP协议。
b) 目录操作:相比FTP协议,TFTP较为简化,通常不支持目录操作,只能在服务器的根目录中进行文件传输。
c) 权限管理:TFTP对权限管理较为简化,通常只需要提供IP地址或者密码作为验证身份的方式。
使用C#实现FTP的文件上传和下载搭建好FTP服务器后,借助.NET Framework提供的类,实现文件的上传和下载是比较简单的事情,下面我们用C#来实现这一过程。
程序主界面下图便是样例程序的界面,输入登录FTP的“用户名”和“密码”,点击“上传”按钮,弹出“打开文件”对话框,选择要上传的文件,“确定”后开开始将文件上传到指定的FTP服务器的文件夹中。
下载文件时,点击“刷新文件列表”,获得FTP服务器上指定文件夹的文件列表,选中要下载的文件,点击下载,将文件下载到本地。
文件上传因为“上传”要使用到流、多线程、网络等技术,故需要导入.NET Framework 相关的名称空间:System.IO、System.Threading、。
实现Ftp的文件上传的核心类便是FtpWebRequest类。
下面是“上传”按钮的Click事件代码:1://上传按钮代码2:private void btnUpload_Click(object sender, EventArgs e)3: {4: OpenFileDialog openDlg = new OpenFileDialog();5:if (openDlg.ShowDialog() != DialogResult.OK) return;6:7:string fileName = openDlg.FileName;8:this.lblFileName.Text = fileName;9: Thread thread = new Thread(new ThreadStart(delegate() 10: {11:this.UploadFileByFtpWebRequest(fileName,this.txtFTPServerIP.Text, this.txtPath.Text, this.txtUserName.Text, this.txtPassword.Text);12: }));13: thread.Start();14: }下面是UploadFileByFtpWebRequest方法的代码:1:private bool UploadFileByFtpWebRequest(string fileName, string ftpServerIP, string path, string userName, string password) 2: {3:bool result = true;4:string url = string.Format("ftp://{0}/{1}/{2}", ftpServerIP, path, fileName.Substring(stIndexOf(@"\") + 1));5:6:FtpWebRequest request =(FtpWebRequest)WebRequest.Create(url);7:request.Credentials = new NetworkCredential(userName, password);8:request.Method = WebRequestMethods.Ftp.UploadFile;9:10:Stream stream = request.GetRequestStream();11:FileStream fileStream = new FileStream(fileName, FileMode.Open);12:13:int packageSize = 1024 * 1024;14:int packageCount = (int)(fileStream.Length / packageSize);15:int rest = (int)(fileStream.Length % packageSize);16:this.BeginInvoke(new DoSomething(delegate()17:{18:this.pbarProcessUpload.Maximum = packageCount;19:if(rest != 0) this.pbarProcessUpload.Maximum += 1;20:}));21:22:for (int index = 0; index < packageCount; index++)23:{24:byte[] buffer = new byte[packageSize];25: fileStream.Read(buffer, 0, buffer.Length);26:27: stream.Write(buffer, 0, buffer.Length);28:29:this.BeginInvoke(new DoSomething(delegate()30: {31:this.pbarProcessUpload.Value = index;32: }));33:}34:35:if (rest != 0)36:{37:byte[] buffer = new byte[rest];38: fileStream.Read(buffer, 0, buffer.Length); 39:40: stream.Write(buffer, 0, buffer.Length); 41:42:this.BeginInvoke(new DoSomething(delegate() 43: {44:this.pbarProcessUpload.Value +=1; 45: }));46:}47:48:stream.Close();49:fileStream.Close();50:51:this.BeginInvoke(new DoSomething(delegate()52:{53:this.pbarProcessUpload.Value = 0; 54:}));55:56:return result;57: }58:private delegate void DoSomething();。
FTP上传下载一:上传单个文件public void uploadimg(){FileInfo fileInf = new FileInfo(textBox1.Text); //本地要上传的文件路径//上传的ftp路径+文件名string uri =@"ftp://222.168.10.108/images/"+textBox1.Text.Substring(stIndexOf('\\'));// 连接FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);eBinary = true; // 指定数据传输类型reqFTP.Credentials = new NetworkCredential("imgupload", "123456"); // ftp用户名和密码// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.UploadFile;//上传文件时通知服务器文件的大小reqFTP.ContentLength = fileInf.Length;//缓冲大小设置为kbint buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;// 打开一个文件流(System.IO.FileStream) 去读上传的文件FileStream fs = fileInf.OpenRead();//把上传的文件写入流Stream strm = reqFTP.GetRequestStream();// 每次读文件流的kbcontentLen = fs.Read(buff, 0, buffLength);// 流内容没有结束while (contentLen != 0){// 把内容从file stream 写入upload streamstrm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}// 关闭两个流strm.Close();fs.Close();}二:ftp遍历下载文件夹private string ftpUser = "imgupload"; //ftp用户名private string ftpPwd = "123456"; //ftp密码///<summary>///获取ftp服务器上的文件信息///</summary>///<returns>存储了所有文件信息的字符串数组</returns>ftppath指定要遍历的ftp文件夹路径public string[] GetFileList(string ftppath){StringBuilder result = new StringBuilder();FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftppath));eBinary = true;ePassive = false;reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;WebResponse response = reqFTP.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream());string line = reader.ReadLine();while (line != null){result.Append(line);result.Append("\n");line = reader.ReadLine();}result.Remove(result.ToString().LastIndexOf('\n'), 1);reader.Close();response.Close();return result.ToString().Split('\n');}Filepath:本地路径、filename:遍历的文件名、ftppath:ftp文件夹路径public void Download(string filePath, string fileName,string ftppath){FtpWebRequest reqFTP;try{FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftppath + "/" + fileName));reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;eBinary = true;reqFTP.Credentials = new NetworkCredential(ftpUser, ftpPwd);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);while (readCount > 0){outputStream.Write(buffer, 0, readCount);readCount = ftpStream.Read(buffer, 0, bufferSize);}ftpStream.Close();outputStream.Close();response.Close();}catch (Exception ex){MessageBox.Show(ex.Message);}}url:ftp文件夹路径string[] ftpwenjianname = GetFileList(url);for (int i = 0; i < ftpwenjianname.Length; i++){Download("D://"+order+"", ftpwenjianname[i].ToString(), url); }通过FTP进行上传下载准备工作:在服务器上创建用户名和密码,赋予权限。
使用FTP下载文件的流程1. 简介FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的标准网络协议。
通过FTP,用户可以在不同的系统之间进行文件上传、下载和删除等操作。
在本文中,我们将讨论如何使用FTP下载文件的流程。
2. 准备工作在使用FTP下载文件之前,我们需要进行一些准备工作。
2.1 确定FTP服务器地址和端口号首先,我们需要确定要从哪个FTP服务器下载文件。
通常,FTP服务器的地址是一个IP地址或域名,而端口号一般是21。
获取到FTP服务器的地址和端口号后,我们可以开始配置FTP客户端。
2.2 配置FTP客户端在使用FTP客户端之前,我们需要下载和安装一个FTP客户端软件。
常见的FTP客户端软件包括FileZilla、WinSCP等。
下载安装完毕后,我们需要进行一些配置。
1.打开FTP客户端软件。
2.在配置界面中,输入FTP服务器的地址和端口号。
3.输入登录凭证,包括用户名和密码。
3. 下载文件的流程下面是使用FTP下载文件的详细步骤:3.1 连接FTP服务器1.打开FTP客户端软件。
2.在主界面中,点击连接按钮或输入命令来连接FTP服务器。
3.2 浏览远程目录1.成功连接到FTP服务器后,你将看到远程目录的列表。
2.导航至所需的目录,使用cd命令或点击相应目录进行导航。
3.3 下载文件1.在远程目录中找到要下载的文件。
2.右键单击文件或选择文件并点击下载按钮。
3.指定将文件下载到本地计算机的位置。
4.点击下载按钮开始下载。
3.4 等待下载完成1.下载过程会花费一些时间,取决于文件的大小和您的网络速度。
2.在下载完成之前,请不要关闭FTP客户端或断开与FTP服务器的连接。
3.5 验证文件完整性1.下载完成后,可以使用文件管理器或计算机终端来验证文件的完整性。
2.比较本地文件的哈希值或文件大小与FTP服务器上的文件是否一致。
4. 注意事项在使用FTP下载文件时,有一些注意事项需要我们注意:•确保FTP服务器的地址和端口号是正确的。
一、编写FTP服务器:二、连接协议:所有ftp协议没有2进制数字,全部用文本格式收发。
发送协议:协议号+描述+CRLF接收协议:协议键+描述+CRLF其中,协议号和协议键是关键字,不能随意变换。
#define CRLF “\r\n”CRLF作为校验使用,因此是必须出现在发送或者接收字串的结尾。
发送长度必须等于strlen或者string.length。
发送长度也是校验条件之一。
协议键不区分大小写给以处理。
例如:创建ftp端口21,使用IE浏览器执行登录。
收到Accept连接后立即返回Send1,之后使用Receive接收你将收到Recv2。
依次向下收发,得到的测试结果如下:Send1=220 127.0.0.1 FtpD for freeRecv2=USER testSend3=331 Password required for test .Recv4=PASS testSend5=230 User test logged in , proceedRecv6=opts utf8 onSend7=502 Command OPTS utf8 on not implementedRecv8=systSend9=215 WindowsRecv10=site helpSend11=502 Command SITE help not implementedRecv12=PWDSend13=257 "/" is current directoryRecv14=CWD /subing/Send15=250 "/subing/" is current directory.Recv16=TYPE ASend17=200 Type set to ASCII.Recv18=PASVSend19=425 Cannot open data connection (192.168.1.13 0 create failed)Recv20=TYPE ASend21=200 Type set to ASCII.Recv22=PORT 127,0,0,1,4,226Send23=200 Port command okay.Recv24=LISTSend25=150 Opening ASCII NO-PRINT mode data connection for ls -l.三、协议内容:每一个协议都是一个判断分支语句,得到是或否的结果再返回(发送)。
linux c 基于libcurl 库的ftp上传和下载代码/zengraoli/article/details/115173672013昨天考虑好了IM传送图片的方式,用的是FTP做缓存来传递图片,以减少聊天服务器的压力,用的是libcurl库,自己下载了一个Server-U 服务器,下面是测试程序,上传和下载都跑通了,剩下的就是在程序中写逻辑来实现具体的功能了。
上传代码:[cpp] view plain copy print?//ftp上传实例// 服务器地址:192.168.0.185 账号:spider 密码:spider // 在服务器路径a 上建立一个a.txt ,本地文件是test.txt // 命令行参数192.168.0.185 spider spider a a.txt D:/test.txt //#include<stdlib.h> //#include <stdio.h> //#include <curl/curl.h> //#include <string.h> // //int debugFun(CURL* curl, curl_infotype type, char* str, size_t len, void* stream) //{ // //只打印CURLINFO_TEXT 类型的信息// if(type == CURLINFO_TEXT) // { // fwrite(str, 1, len, (FILE*)stream); // } // return 0; //} // //int main(int argc, char** argv)//{ // CURL* curl; // CURLcode res; // char errorBuf[CURL_ERROR_SIZE]; // FILE*sendFile, *debugFile; // char ftpurl[256 + 1]; // char usrpasswd[64 + 1]; // // curl_slist *slist=NULL; // // if(argc != 7) // { //printf("Usage:\n\t./ftp ip username password ftpPath destFileName srcFile"); // return -1; // } // // //将相关的调试信息打印到dubugFile.txt中//if(NULL == (debugFile = fopen("debugFile.txt", "a+"))) // return -1; // // //打开ftp上传的源文件//if(NULL == (sendFile = fopen(argv[6], "r"))) // { // fclose(debugFile); // return -1; // } // // //获取需要发送文件的大小// fseek(sendFile, 0, SEEK_END); // int sendSize = ftell(sendFile); //if(sendSize < 0) // { //fclose(debugFile); // fclose(sendFile); // return -1; // } // fseek(sendFile, 0L,SEEK_SET); // // if((res =curl_global_init(CURL_GLOBAL_ALL)) != 0) //{ // fclose(debugFile); //fclose(sendFile); // return -1; // } //if((curl = curl_easy_init()) == NULL) // { // fclose(debugFile); // fclose(sendFile); //curl_global_cleanup(); // return -1; // }// // if(argv[4][strlen(argv[4]) - 1] != '/') //sprintf(ftpurl, "ftp://%s/%s/%s", argv[1], argv[4], argv[5]);// else // sprintf(ftpurl, "ftp://%s/%s%s",argv[1], argv[4], argv[5]); // curl_easy_setopt(curl, CURLOPT_URL, ftpurl); // //设置ftp上传url,组成如下的URL ////ftp://192.168.31.145//root/subdir/curl/testftp.txt // // sprintf(usrpasswd, "%s:%s", argv[2], argv[3]); //curl_easy_setopt(curl, CURLOPT_USERPWD, usrpasswd);// // curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // curl_easy_setopt(curl, CURLOPT_DEBUGDATA, debugFile); // // curl_easy_setopt(curl,CURLOPT_READDATA, sendFile); //curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); //curl_easy_setopt(curl, CURLOPT_INFILESIZE, sendSize);// curl_easy_setopt(curl,CURLOPT_FTP_CREATE_MISSING_DIRS, 1); // // curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debugFun); // // res = curl_easy_perform(curl); // if(0 != res) // { // fclose(sendFile); // fclose(debugFile); // curl_easy_cleanup(curl);// curl_global_cleanup(); // return -1;// } // // curl_easy_cleanup(curl); //fclose(sendFile); // fclose(debugFile); //curl_global_cleanup(); // getchar(); // return 0;//}下载代码如下:[cpp] view plain copy print?//ftp下载实例#include <stdio.h>; #include <curl/curl.h>;#include <curl/types.h>; #include <curl/easy.h>; struct FtpFile //定义一个结构为了传递给my_fwrite函数.可用curl_easy_setopt的CURLOPT_WRITEDATA选项传递{ char *filename; FILE *stream; }; int my_fwrite(void *buffer, size_t size, size_t nmemb, void*stream) { struct FtpFile *out=(struct FtpFile *)stream; // stream指针其实就是指向struct FtpFile ftpfile的if(out && !out->stream){ out->stream=fopen(out->filenam e, "wb"); //没有这个流的话就创建一个名字是out->filename. if(!out->stream) return -1; } return fwrite(buffer, size, nmemb, out->stream); } int main(int argc, char*argv[]) { CURL *curl;CURLcode res; struct FtpFileftpfile={"D:/Success.txt",NULL}; //初始化一个FtpFile结构curl_global_init(CURL_GLOBAL_DEFAULT);curl = curl_easy_init(); if(curl){ curl_easy_setopt(curl,CURLOPT_URL,"ftp://192.168.0.185/a/a.txt");curl_easy_setopt(curl, CURLOPT_USERPWD,"spider:spider"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,my_fwrite); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); //给相关函数的第四个参数传递一个结构体的指针curl_easy_setopt(curl, CURLOPT_VERBOSE,TRUE);//CURLOPT_VERBOSE 这个选项很常用用来在屏幕上显示对服务器相关操作返回的信息res = curl_easy_perform(curl);curl_easy_cleanup(curl);if(CURLE_OK != res)fprintf(stderr, "curl told us %d\n", res); }if(ftpfile.stream) fclose(ftpfile.stream);curl_global_cleanup(); return 0; }最后记录一个比较好用的:[cpp] view plain copyprint?#include <stdlib.h> #include <stdio.h>#include <curl/curl.h> #include <sys/stat.h> /* parse headers for Content-Length */ size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) { int r; long len = 0; /*_snscanf() is Win32 specific */ //r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len); r = sscanf((const char*)ptr, "Content-Length: %ld\n", &len); if (r) /* Microsoft: we don't read the specs */ *((long *) stream) = len; return size * nmemb; } /* discard downloaded data */ size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream) { return size * nmemb; } //write data to upload size_t writefunc(void *ptr, size_t size, size_t nmemb, void *stream) { return fwrite(ptr, size, nmemb, (FILE*)stream); } /* read data to upload */ size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream) { FILE *f = (FILE*)stream; size_t n; if (ferror(f)) returnCURL_READFUNC_ABORT; n = fread(ptr, size, nmemb, f) * size; return n; } int upload(CURL*curlhandle, const char * remotepath, const char * localpath, long timeout, long tries) { FILE *f; long uploaded_len = 0; CURLcode r =CURLE_GOT_NOTHING; int c; f =fopen(localpath, "rb"); if (f == NULL){ perror(NULL); return 0; }curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath); curl_easy_setopt(curlhandle, CURLOPT_USERPWD, "spider:spider"); if (timeout)curl_easy_setopt(curlhandle,CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc); curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc); curl_easy_setopt(curlhandle,CURLOPT_READFUNCTION, readfunc);curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */ curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);for (c = 0; (r != CURLE_OK) && (c < tries); c++) { /* are we resuming? */ if (c) { /* yes *//* determine the length of the file already written *//* * With NOBODY and NOHEADER, libcurl will issue a SIZE * command, but the only way to retrieve the result is * to parse the returned Content-Length header. Thus, * getcontentlengthfunc(). We need discardfunc() above* because HEADER will dump the headers to stdout* without it. */curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);r = curl_easy_perform(curlhandle); if (r != CURLE_OK) continue;curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L); fseek(f, uploaded_len, SEEK_SET);curl_easy_setopt(curlhandle, CURLOPT_APPEND,1L); } else { /* no */curl_easy_setopt(curlhandle, CURLOPT_APPEND,0L); } r =curl_easy_perform(curlhandle); } fclose(f);if (r == CURLE_OK) return 1; else{ fprintf(stderr, "%s\n", curl_easy_strerror(r));return 0; } } // 下载int download(CURL*curlhandle, const char * remotepath, const char * localpath, long timeout, long tries) { FILE *f; curl_off_t local_file_len = -1 ; long filesize =0 ; CURLcode r = CURLE_GOT_NOTHING; struct stat file_info;int use_resume = 0; //获取本地文件大小信息if(stat(localpath, &file_info) == 0){ local_file_len = file_info.st_size;use_resume = 1; } //追加方式打开文件,实现断点续传 f = fopen(localpath, "ab+"); if (f == NULL) { perror(NULL); return 0; }curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath); curl_easy_setopt(curlhandle, CURLOPT_USERPWD, "spider:spider"); //连接超时设置curl_easy_setopt(curlhandle,CURLOPT_CONNECTTIMEOUT, timeout); //设置头处理函数curl_easy_setopt(curlhandle,CURLOPT_HEADERFUNCTION, getcontentlengthfunc);curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA,&filesize); // 设置断点续传curl_easy_setopt(curlhandle,CURLOPT_RESUME_FROM_LARGE,use_resume?local_file_len:0);curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, writefunc); curl_easy_setopt(curlhandle,CURLOPT_WRITEDATA, f);curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);r = curl_easy_perform(curlhandle); fclose(f); if (r == CURLE_OK) return 1; else{ fprintf(stderr, "%s\n", curl_easy_strerror(r)); return 0; } } int main(int c, char **argv){ CURL *curlhandle = NULL; CURL *curldwn = NULL; curl_global_init(CURL_GLOBAL_ALL); curlhandle = curl_easy_init(); curldwn = curl_easy_init(); upload(curlhandle, "ftp://192.168.0.185/a/success", "D:/abc.jpg", 1, 3); download(curldwn, "ftp://192.168.0.185/a/success", "D:/abc1.jpg", 1, 3); curl_easy_cleanup(curlhandle);curl_easy_cleanup(curldwn); curl_global_cleanup(); return 0; }。
c#上传下载ftp(⽀持断点续传)这个ftpClient是从⽹上找来的,⾃⼰加了断点续传的⽅法using System;using ;using System.IO;using System.Text;using .Sockets;namespace ftpGet{///<summary>/// FTP Client///</summary>public class FTPClient{构造函数登陆字段、属性链接传输模式⽂件操作上传和下载⽬录操作内部变量内部函数}}当然,⼤家还要看看Main⽅法using System;using System.Collections.Generic;using System.Text;using System.IO;namespace ftpGet{class Program{static string remotingFolder = System.Configuration.ConfigurationSettings.AppSettings["remotingFolder"]; //远程ftp⽂件⽬录static string localFolder = System.Configuration.ConfigurationSettings.AppSettings["localFolder"]; //要下载到的本地⽬录static string ftpServer = System.Configuration.ConfigurationSettings.AppSettings["ftpServer"]; //ftp服务器static string user = System.Configuration.ConfigurationSettings.AppSettings["user"]; //⽤户名static string pwd = System.Configuration.ConfigurationSettings.AppSettings["pwd"]; //密码static string port = System.Configuration.ConfigurationSettings.AppSettings["port"]; //端⼝static void Main(string[] args){FTPClient client = new FTPClient(ftpServer, "/", user, pwd, int.Parse(port));client.Connect();GetFolder("*", remotingFolder, client, CreateFolder());client.DisConnect();ClearFolder();Console.WriteLine("下载完毕");System.Threading.Thread.Sleep(3000);}///<summary>///在本地⽬录下创建⼀个以⽇期为名称的⽬录,我做这个ftp的主要⽬的是为了每天都备份///</summary>///<returns>创建的⽬录名</returns>private static string CreateFolder(){string folder=localFolder + "\\"+DateTime.Now.ToShortDateString();if (!Directory.Exists(folder))Directory.CreateDirectory(folder);return folder;}///<summary>///在下载结束后清空程序⽬录的多余⽂件///</summary>private static void ClearFolder(){string folder = Environment.CurrentDirectory;string[] dictorys = Directory.GetFiles(folder);foreach (string dictory in dictorys){FileInfo info = new FileInfo(dictory);if (info.Length == 0)File.Delete(dictory);}}///<summary>///递归获取ftp⽂件夹的内容///</summary>///<param name="fileMark">⽂件标记</param>///<param name="path">远程路径</param>///<param name="client"></param>///<param name="folder"></param>private static void GetFolder(string fileMark, string path, FTPClient client, string folder) {string[] dirs = client.Dir(path); //获取⽬录下的内容client.ChDir(path); //改变⽬录foreach (string dir in dirs){string[] infos = dir.Split(' ');string info = infos[infos.Length - 1].Replace("\r", "");if (dir.StartsWith("d") && !string.IsNullOrEmpty(dir)) //为⽬录{if (!info.EndsWith(".") && !info.EndsWith("..")) //筛选出真实的⽬录{Directory.CreateDirectory(folder + "\\" + info);GetFolder(fileMark, path + "/" + info, client, folder + "\\" + info);client.ChDir(path);}}else if (dir.StartsWith("-r")) //为⽂件{string file = folder + "\\" + info;if (File.Exists(file)){long remotingSize = client.GetFileSize(info);FileInfo fileInfo = new FileInfo(file);long localSize = fileInfo.Length;if (remotingSize != localSize) //短点续传{client.GetBrokenFile(info, folder, info, localSize);}}else{client.GetFile(info, folder, info); //下载⽂件Console.WriteLine("⽂件" + folder + info + "已经下载");}}}}}}配置⽂件<?xml version="1.0" encoding="utf-8" ?><configuration><appSettings><add key="remotingFolder" value="/temp"/><add key="localFolder" value="c:\temp"/><add key="ftpServer" value="*"/><add key="user" value="*"/><add key="pwd" value="*"/><add key="port" value="21"/></appSettings></configuration>。
VC实现文件上传下载(FTP)
//连接ftp服务器
void CMyFtpDlg::OnConnect()
{
UpdateData(TRUE);
//新建对话
m_pInetSession=new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_AC CESS);
try
{
//新建连接对象
m_pFtpConnection=m_pInetSession-> GetFtpConnection(m_strServer,m_strUserName,
m_strPassword);
}
catch(CInternetException *pEx)
{
//获取错误
TCHAR szError[1024];
if(pEx-> GetErrorMessage(szError,1024))
AfxMessageBox(szError);
else
AfxMessageBox( "There was an exception ");
pEx-> Delete();
m_pFtpConnection=NULL;
return;
}
m_pRemoteFinder = new CFtpFileFind(m_pFtpConnection);
//获得服务器根目录的所有文件并在列表框中显示
BrowseDir( " ",&m_ctrlRemoteFiles,m_pRemoteFinder,&m_arrRemoteFiles);
}
//下载单个文件
void CMyFtpDlg::DownFile(FILEITEM fileItem)
{
if(fileItem.bDir == TRUE)
{
AfxMessageBox( "本程序暂时不支持下载整个文件夹,请选择文件下载");
}
else
{
//格式化文件名
CString strLocalFile,strRemoteFile;
strRemoteFile.Format( "%s\\%s ",m_pRemoteFinder-> GetRoot(),fileItem.strFileName); strLocalFile.Format( "%s\\%s ",m_LocalFinder.GetRoot(),fileItem.strFileName);
//下载
if(m_pFtpConnection-> GetFile(strLocalFile,strLocalFile))
{
CString strMsg;
strMsg.Format( "下载文件%s成功! ",fileItem.strFileName);
AfxMessageBox(strMsg);
}
}
}
//上传单个文件
void CMyFtpDlg::UpFile(FILEITEM fileItem)
{
if(fileItem.bDir == TRUE)
{
AfxMessageBox( "本程序暂时不支持上载整个文件夹,请选择文件上载");
}
else
{
//格式化文件名
CString strLocalFile,strRemoteFile;
strRemoteFile.Format( "%s\\%s ",m_pRemoteFinder-> GetRoot(),fileItem.strFileName); strLocalFile.Format( "%s\\%s ",m_LocalFinder.GetRoot(),fileItem.strFileName);
//上传
if(m_pFtpConnection-> PutFile(strLocalFile,strLocalFile))
{
CString strMsg;
strMsg.Format( "上载文件%s成功! ",fileItem.strFileName);
AfxMessageBox(strMsg);
}
}
}。