C语言 HTTP上传文件-利用libcurl库上传文件

原文  http://justwinit.cn/post/7626/

通常情况下,一般很少使用C语言来直接上传文件,但是遇到使用C语言编程实现文件上传时,该怎么做呢?

借助开源的libcurl库,我们可以容易地实现这个功能。Libcurl是一个免费易用的客户端URL传输库,主要功能是用不同的协议连接和沟通不同的服务器,libcurl当前支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP,IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet andTFTP。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证等。下面借鉴libcurl官网的例子完成简单的文件上传。

模拟要实现的文件上传FORM:

File: FileName:

其中,fileUpload.action为文件处理文件上传的接口,根据实际需要配置,这里只是一个例子。

C语言HTTP上传文件的代码如下:

#include 

#include 

#include 

int main(int argc, char *argv[])
{
  CURL *curl;
  CURLcode res;  

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

  curl_global_init(CURL_GLOBAL_ALL);  

  /* Fill in the file upload field */
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "sendfile",
               CURLFORM_FILE, "D:\\sign.txt",
               CURLFORM_END);  

  /* Fill in the filename field */
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "filename",
               CURLFORM_COPYCONTENTS, "sign.txt",
               CURLFORM_END);  

  /* Fill in the submit field too, even if this is rarely needed */
  curl_formadd(&formpost,
               &lastptr,
               CURLFORM_COPYNAME, "submit",
               CURLFORM_COPYCONTENTS, "Submit",
               CURLFORM_END);  

  curl = curl_easy_init();
  /* initalize custom header list (stating that Expect: 100-continue is not
     wanted */
  headerlist = curl_slist_append(headerlist, buf);
  if(curl) {
    /* what URL that receives this POST */  

     curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8080/fileUpload.action");
    if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) )
      /* only disable 100-continue header if explicitly requested */
      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);  

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));  

    /* always cleanup */
    curl_easy_cleanup(curl);  

    /* then cleanup the formpost chain */
    curl_formfree(formpost);
    /* free slist */
    curl_slist_free_all (headerlist);
  }
  return 0;
}

代码经过测试,可以使用,但是需要提前配置好Libcur库,以及编译环境,这个自行google。代码很粗糙,功能很简单,只是起个抛砖引玉的作用,希望能对大家有所帮助。

来自:http://blog.csdn.net/sxwyf248/article/details/7984776

VC2013下,使用curl:

http://www.tuicool.com/articles/A73ARr

较细:http://blog.csdn.net/mjpassion/article/details/6290912

Visual2012:http://www.howzhi.com/course/3387/lesson/43112

参考:http://www.cppblog.com/len/archive/2008/06/21/54229.html

使用libcurl模拟form表单上传的问题:

http://bbs.csdn.net/topics/390817077

在C语言程序中使用cURL库(libcurl):

http://demon.tw/programming/c-libcurl.html

时间: 2024-08-06 09:18:50

C语言 HTTP上传文件-利用libcurl库上传文件的相关文章

利用python-twisted库实现一个文件收发服务

最近在学习python-twisted库,之前做异步并发编程一直都是使用c++,比如linux下的epoll机制,windows的IOCP机制,到后来经常使用的Boost::Asio库,比较搞的是c++上的异步经验反而有点阻碍我开始学习twisted库,原因如下: 不管是epoll还是IOCP,都是当读操作或者写操作可执行时(IOCP则是完成时)会得到一个通知,然后可以执行自己的下一步代码.这种情景下如果你是做较大数据的收发的话,就可以在得到通知时进行必要的处理后继续发送或者接受下一个数据块,但

【Servlet】利用Servlet3.0标准与JSTL表达式实现文件上传系统,支持图片上传后显示

伴随着JDK1.6一起出现的Servlet3.0标准,使得JSP的文件上传系统不再艰难,此前在JSP的文件上传系统需要<[Jsp]使用jspsmartupload完成简单的文件上传系统>(点击打开链接)类似这样的插件才能完成的文件上传系统,还不支持中文,使得各位程序猿掏空心思才能解决这个问题.现在Servlet3.0对文件上传的方法进行封装,无须分块就可以实现.而且Servlet3.0还不用类似<[Servlet]最简单的Servlet JavaWeb程序>(点击打开链接)在web

selenium2 python自动化测试之利用AutoIt工具实现本地文件上传

本人在学习基于python语言的selenium2自动测试方法的过程中,发现涉及本地上传文件的测试时,selenium2在定位本地window窗口的对象(元素)上能力有限.当上传按钮使用的是input标签时,可以使用send_keys()方法添加本地文件路径轻松实现,但有的上传控件使用的不是input元素,这个时候send_keys()方法是行不通的.经过网上搜索加上自己实践,总结出一个非常简单而有效的方法--借用AutoIt工具实现自动化本地上传文件,在此与大家分享. 1.AutoIt介绍及安

利用spring的MultipartFile实现文件上传【原】

利用spring的MultipartFile实现文件上传 主要依赖jar包 spring-web-3.0.6.RELEASE.jar 用到 (org.springframework.web.multipart.MultipartFile)commons-fileupload-1.3.1.jarcommons-logging-1.0.4.jar 前台 <!DOCTYPE html> <html lang="en"> <head> <meta ch

利用HTML5分片上传超大文件

在网页中直接上传大文件一直是个比较头疼的问题,主要面临的问题一般包括两类:一是上传时间长中途一旦出错会导致前功尽弃:二是服务端配置复杂,要考虑接收超大表单和超时问题,如果是托管主机没准还改不了配置,默认只能接收小于4MB的附件. 比较理想的方案是能够把大文件分片,一片一片的传到服务端,再由服务端合并.这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分片的大小可以控制在4MB以内,服务端不用做任何设置就可适应. 常用的解决方案是RIA,以flex为例,通常是利用File

利用Socketserver实现简单的文件上传

利用Socketserver实现简单的文件上传 server.py #!/usr/bin/env python #coding:utf-8 import SocketServer import os class MyServer(SocketServer.BaseRequestHandler):     def handle(self):         base_path = 'C:/temp'         conn = self.request                 print

利用scp 远程上传下载文件/文件夹

利用scp传输文件 1.从服务器下载文件scp [email protected]:/path/filename /tmp/local_destination例如scp [email protected]:/home/kimi/test.txt  把192.168.0.101上的/home/kimi/test.txt的文件下载到 /tmp/local_destination 2.上传本地文件到服务器scp /path/local_filename [email protected]:/path 

利用 secureCRT 直接上传下载文件 (sz,rz)

在window下向linux传送文件的方法. 首先在window中安装SecureCRT,然后在快速连接中建立一个到linux的连接,当然,你要先知道你的系统的ip,在终端中键入ifconfig可以查看到. 然后连接即可登陆到linux的终端下 要从linux传文件到window的话,这需要cd到你要传的文件的目录,然后用命令:sz 文件名即可上传.文件放在securesrt/download下面 要从window传送文件到linux,则在终端中输入rz,然后会出来一个对话框让你选择文件传送的.

在Servlet中利用Apache开源类库实现文件上传

本文结合具体的范例,介绍如何通过Apache开源类库提供的软件包,在Servlet中进行文件上传.本文的参考书籍是<Tomcat与Java Web开发技术详解>第三版,作者:孙卫琴. 本文所用的软件版本为:Window10,JDK10,Tomcat9.本文所涉及的源代码的下载网址为:http://www.javathinker.net/javaweb/upload-app.rar Apache开源软件组织提供了与文件上传有关的两个软件包:? fileupload软件包(commons-file