利用http实现文件的上传和下载

其他语言都比较方便,使用http上传。但是C++这样就差点,不过还好,Linux下有个curl的命令行工具,这是一个开源项目,底下有个子项目是libcurl,curl就是调用这个API实现的一系列ftp,http等上传下载的功能,这个库功能还是挺多的。支持的协议也多。这样就可以利用这个库来实现http上传和下载了。

当然这个库的API有两种接口,一种是esay的-------同步阻塞模式。另一种是Multi的,我没研究它,以下用的都是easy的接口,来写的样例代码。

不过在学这个库的接口之前,最好先了解下http,特别是GET和POST方法的区别,这两个方法前者涉及到对URL的查询,后者涉及到对URL的改写。当然GET和POST都可以向server传输数据。并不能根据它们的名字直接理解,详情请看http协议吧。我找了两个不错的博客连接,来理解http相关的内容,非常不错,写得很好:

http://www.cnblogs.com/devil-91/archive/2012/05/11/2495266.html

http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

文件上传类:

H文件:

#ifndef QCURL_SENDER_H
#define QCURL_SENDER_H

#include <string>

#include <curl/curl.h>

class CurlSender{

public:
	CurlSender();
	~CurlSender();

	bool isValid() const;
	void setUrl(const std::string& url);
	bool send(const std::string &file);

private:
	std::string getFileNameFromPath(const std::string& path);

private:
	CURL* m_hCurl;
	std::string m_url;
	bool m_isValid;
};

#endif

  .cpp文件

#include "QCurlSender.h"

CurlSender::CurlSender():
m_hCurl(nullptr), m_isValid(false)
{
	curl_global_init(CURL_GLOBAL_ALL);
	 m_hCurl = curl_easy_init();

	 if (m_hCurl)
	 {
		 m_isValid = true;
	 }
}

CurlSender::~CurlSender()
{
	if (m_hCurl)
	{
		curl_easy_cleanup(m_hCurl);
	}

	curl_global_cleanup();
}

bool CurlSender::isValid() const
{
	return m_isValid;
}

void CurlSender::setUrl(const std::string& url)
{
	m_url = url;
}

bool CurlSender::send(const std::string &file)
{

	curl_slist* pOptionList = NULL;
	pOptionList = curl_slist_append(pOptionList, "Expect:");
	curl_easy_setopt(m_hCurl, CURLOPT_HTTPHEADER, pOptionList);

	curl_httppost* pFormPost = NULL;
	curl_httppost* pLastElem = NULL;

	//上传文件,指定本地文件完整路径
	curl_formadd(&pFormPost, &pLastElem, CURLFORM_COPYNAME, "sendfile",
		CURLFORM_FILE, file.c_str(), CURLFORM_CONTENTTYPE,
		"application/octet-stream", CURLFORM_END);

	curl_formadd(&pFormPost, &pLastElem,
		CURLFORM_COPYNAME, "filename",
		CURLFORM_COPYCONTENTS, getFileNameFromPath(file).c_str(),
		CURLFORM_END);
	//不加一个结束的hfs服务端无法写入文件,一般不存在这种问题,这里加入只是为了测试.
	curl_formadd(&pFormPost, &pLastElem, CURLFORM_COPYNAME, "end", CURLFORM_COPYCONTENTS, "end", CURLFORM_END);
	curl_easy_setopt(m_hCurl, CURLOPT_HTTPPOST, pFormPost);
	curl_easy_setopt(m_hCurl, CURLOPT_URL, m_url.c_str());

	CURLcode res = curl_easy_perform(m_hCurl);
	if (res != CURLE_OK)
	{
		return false;
	}

	curl_formfree(pFormPost);

	return true;
}

std::string CurlSender::getFileNameFromPath(const std::string& path)
{

	return path.substr(path.find_last_of("/\\") + 1);

}

  

references:

http://www.cnblogs.com/cswuyg/archive/2013/07/11/3185164.html

http://www.cnblogs.com/lidabo/p/4159574.html

http://blog.csdn.net/breaksoftware/article/details/45874197

http://stackoverflow.com/questions/8520560/get-a-file-name-from-a-path

时间: 2024-10-11 11:15:55

利用http实现文件的上传和下载的相关文章

使用Loadrunner进行文件的上传和下载

最近使用loadrunner中需要录制文件的上传和下载,上传功能模块利用录制可以直接实现,下载无法实现,在网上找到了一段代码,自己动手试验了下,发现没有用 辛苦找到的,还是记录下吧 (1)LoadRunner上传文件 web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST", "EncTy

iOS开发中文件的上传和下载功能的基本实现-备用

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc

JSP中文件的上传于下载示例

一.文件上传的原理 1.文件上传的前提: a.form表单的method必须是post b.form表单的enctype必须是multipart/form-data(决定了POST请求方式,请求正文的数据类型) 注意:当表单的enctype是multipart/form-data,传统的获取请求参数的方法失效. 请求正文:(MIME协议进行描述的,正文是多部分组成的) -----------------------------7dd32c39803b2 Content-Disposition:

.net web开发——文件的上传和下载

以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  可以带参数 [HttpPost("upload")] public JsonResult uploadProject(IFormFile file, string userId) { if (file != null) { var fileDir = "D:\\aaa"

【Linux命令】--(4)文件打包上传和下载

文件打包上传和下载 +++++++++++++++++++++++++++++++用SecureCRT来上传和下载文件tar命令gzip命令+++++++++++++++++++++++++++++++先把计划放着,待老夫国庆把它学完!

【php】文件的上传与下载

一. 生活中常见的地方: a) 例如邮箱.空间.文库.百度云.微爱等地方,都可以看到文件的上传和下载的应用,因此,上传和下载的功能非常重要!二. PHP当中的文件上传和下载 a) 我们需要进行一些设置,来使我们的表单具有提交文件的功能! b) 客户端的设置: i. 其实就是表单的设置: 1. input表单项中的type属性值必须是file类型 2. form表单头部需要添加一个通行证:enctype="multipart/form-data",含义为让服务器认识到我们要在这个表单中上

SpringMVC实现文件的上传和下载

前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流".我回复他说:"使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要依赖Apache提供Commons FileUpload组件jar包."鉴于这个问题,我上网也百度了一下,网上很多都是介绍的使用IO流来实现文件的上传和下载,也有说到框架的,但介绍的并不是很完整,今天小钱将和大家介绍使用Spr

SecureCRT使用sz和rz命令进行文件的上传和下载

SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. 本地文件夹可以通过Options-->Session Options中进行设置.

步步为营-70-asp.net简单练习(文件的上传和下载)

大文件的上传一般通过FTP协议,而一般小的文件可以通过http协议来完成 1 通过asp.net 完成图片的上传 1.1 创建html页面 注意:1 method="post" ;2 enctype="multipart/form-data"; 3 <input type="file" /> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&