读书人

C语言 HTTP下传文件

发布时间: 2012-09-19 13:43:54 作者: rapoo

C语言 HTTP上传文件

通常情况下,一般很少使用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:

#include <stdio.h>#include <string.h>#include <curl/curl.h>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。代码很粗糙,功能很简单,只是起个抛砖引玉的作用,希望能对大家有所帮助。



读书人网 >C语言

热点推荐