libcurl 文件上传下载实例

vs环境

使用libcurl静态链接库

生成静态链接库参考:Windows系统 libcurl静态链接环境配置(不带ssl)

#include<iostream>
#include<string>
#include<ctime>
#include "curl/curl.h"

int nMethod = -1;
char szFileFrom[64] = "";

int uploadfile()
{
	CURL *curl;

	CURLM *multi_handle;
	int still_running;

	struct curl_httppost *formpost = NULL;
	struct curl_httppost *lastptr = NULL;
	struct curl_slist *headerlist = NULL;
	static const char buf[] = "Expect:";

	curl_formadd(&formpost,
		&lastptr,
		CURLFORM_PTRNAME, "file",
		//CURLFORM_FILE, "C:\\SMGConfig.ini",
		CURLFORM_FILE, szFileFrom,
		CURLFORM_END);

	curl = curl_easy_init();
	multi_handle = curl_multi_init();

	/* initalize custom header list (stating that Expect: 100-continue is not
	   wanted */
	headerlist = curl_slist_append(headerlist, buf);
	if (curl && multi_handle) {
		/* what URL that receives this POST */
		curl_easy_setopt(curl, CURLOPT_URL, "http://172.16.20.48/API/upload.php");
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
		curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

		curl_easy_setopt(curl, CURLOPT_USERPWD, "ApiUserAdmin:123456");

		curl_multi_add_handle(multi_handle, curl);

		curl_multi_perform(multi_handle, &still_running);

		do {
			struct timeval timeout;
			int rc; /* select() return code */

			fd_set fdread;
			fd_set fdwrite;
			fd_set fdexcep;
			int maxfd = -1;

			long curl_timeo = -1;

			FD_ZERO(&fdread);
			FD_ZERO(&fdwrite);
			FD_ZERO(&fdexcep);

			/* set a suitable timeout to play around with */
			timeout.tv_sec = 1;
			timeout.tv_usec = 0;

			curl_multi_timeout(multi_handle, &curl_timeo);
			if (curl_timeo >= 0) {
				timeout.tv_sec = curl_timeo / 1000;
				if (timeout.tv_sec > 1)
					timeout.tv_sec = 1;
				else
					timeout.tv_usec = (curl_timeo % 1000) * 1000;
			}

			/* get file descriptors from the transfers */
			curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);

			/* In a real-world program you OF COURSE check the return code of the
			   function calls.  On success, the value of maxfd is guaranteed to be
			   greater or equal than -1.  We call select(maxfd + 1, ...), specially in
			   case of (maxfd == -1), we call select(0, ...), which is basically equal
			   to sleep. */

			rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);

			switch (rc) {
			case -1:
				/* select error */
				break;
			case 0:
			default:
				/* timeout or readable/writable sockets */
				//printf("perform!\n");
				curl_multi_perform(multi_handle, &still_running);
				//printf("running: %d!\n", still_running);
				break;
			}
		} while (still_running);

		curl_multi_cleanup(multi_handle);

		/* always cleanup */
		curl_easy_cleanup(curl);

		/* then cleanup the formpost chain */
		curl_formfree(formpost);

		/* free slist */
		curl_slist_free_all(headerlist);
	}
	return 0;
}
struct FtpFile {
	const char *filename;
	FILE *stream;
};

size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
	struct FtpFile *out = (struct FtpFile *)stream;

	if (out && !out->stream) {
		out->stream = fopen(out->filename, "wb");//打开文件进行写入
		if (!out->stream)
			return -1;
	}
	return fwrite(buffer, size, nmemb, out->stream);
}

int downloadfile()
{
	CURL *curl;
	CURLcode res;

	struct FtpFile ftpfile = {
		//"C://SMGConfig.ini", //定义下载到本地的文件位置和路径
		szFileFrom,
		NULL
	};

	curl_global_init(CURL_GLOBAL_DEFAULT);
	curl = curl_easy_init();  //初始化一个curl指针

	if (curl)//curl对象存在的情况下执行的操作
	{ 
		//从下载到本地路径中截取文件名
		char szRemoteUrl[128] = "";
		std::string strFileUrl = szFileFrom;
		int pos = strFileUrl.rfind("\\\\");
		if (pos >= 0)
		{
			std::string strFileName = strFileUrl.substr(pos+2);
			sprintf(szRemoteUrl, "http://172.16.20.48/Config/%s", strFileName.c_str());
		}
		else
		{
			printf("找不到下载文件名!\n");
		}

		//设置远端地址
		//curl_easy_setopt(curl, CURLOPT_URL, "http://172.16.20.48/Config/SMGConfig.ini");
		curl_easy_setopt(curl, CURLOPT_URL, szRemoteUrl);

		//执行写入文件流操作
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);//当有数据被写入,回调函数被调用,

		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); //设置结构体的指针传递给回调函数

		//启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中

		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

		//curl_easy_setopt(curl, CURLOPT_USERPWD, "SUREN:SUREN");
		curl_easy_setopt(curl, CURLOPT_USERPWD, "ApiUserAdmin:123456");

		//写入文件
		res = curl_easy_perform(curl);

		//释放curl对象
		curl_easy_cleanup(curl);

		if (res != CURLE_OK)
		{
			std::cout << stderr << res << std::endl;
		}
	}

	if (ftpfile.stream)
	{
		//关闭文件流
		fclose(ftpfile.stream);
	}
	//释放全局curl对象
	curl_global_cleanup();

	return 0;
}

int main()
{
	//uploadfile();
	//downloadfile();
AGAIN:
	printf("uploadfile:1  downloadfile:2 exit:3 \n");
	std::cin >> nMethod;
	if (nMethod != -1)
	{
		if (nMethod == 1)
		{
			printf("本地上传文件路径(文件名需与远端文件名一致,如:C:\\\\SMGConfig.ini): \n");
			std::cin >> szFileFrom;
			uploadfile();
		}	
		else if (nMethod == 2)
		{
			printf("下载到本地路径(文件名需与远端文件名一致,如:C:\\\\SMGConfig.ini): \n");
			std::cin >> szFileFrom;
			downloadfile();
		}
		else if (nMethod == 3)
		{
			system("pause");
			return 0;
		}
		else
		{
			printf("请输入1 2或3!\n");
			goto AGAIN;
		}
	}
	goto AGAIN;
	system("pause");
	return 0;
}
upload.php
<?php 
	/*
    //获取文件后缀
    function fileext($filename)
	{
		return substr(strrchr($filename, '.'), 1);
	}
	*/
    
    $file = $_FILES['file']['name'];
    $file_tmp = $_FILES['file']['tmp_name'];
    if(isset($file))
    {
    	/*
    	//设置允许上传文件的类型
        $type=array("ini");
        //判断文件类型
        if(!in_array(strtolower(fileext($file)),$type))
        {
            header("HTTP/1.1 415 ERROR FILE TYPE");
            dump_to_file("$date $file error file type!");
            return;
        }
		*/
		
        $date = date('Y-m-d H:i:s');

        if (move_uploaded_file($file_tmp,"/mnt/flash/$file"))
        {
            dump_to_file("$date upload $file succeful!");
        }
    }
?>

 

licurl静态链接库:https://download.csdn.net/download/aixiaoql/12461024

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值