Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5771526
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2008-12-19 16:01:07

先看HTML代码:

    
        
        File Upload
    

    

        
        
    





相应的C代码:
#include
#include
#include
#include
#include
#include
#include

#define MAX_BUFF_LEN 1048576 /*1M*/
#define POST_URL ""

int check_file_existed(char *filename)
{
    struct stat st;
     return (stat( filename, &st )==0 && S_ISREG(st.st_mode));
}

int get_file_size(char *filename)
{
    int file_len = 0;
    int fd = 0;

    fd = open(filename, O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        exit(-1);
    }

    file_len = lseek(fd, 0, SEEK_END);
    if(file_len < 0)
    {
        perror("lseek");
        exit(-1);
    }

    return file_len;
}

int http_post_file(const char *url, const char *filename)
{
    CURL *curl = NULL;
       CURLcode res;

      struct curl_httppost *post=NULL;
      struct curl_httppost *last=NULL;
      struct curl_slist *headerlist=NULL;

    if(filename == NULL || url == NULL)
        return -1;

    printf("URL: %s\n", url);
    printf("filename: %s\n", filename);

    /* Add simple file section */
    if( curl_formadd(&post, &last, CURLFORM_COPYNAME, "upload",
               CURLFORM_FILE, filename, CURLFORM_END) != 0)
    {
        fprintf(stderr, "curl_formadd error.\n");
        goto out;
    }
    
      /* Fill in the submit field too, even if this is rarely needed */
      curl_formadd(&post, &last,
               CURLFORM_COPYNAME, "submit",
               CURLFORM_COPYCONTENTS, "OK",
               CURLFORM_END);

    //curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    if(curl == NULL)
    {
        fprintf(stderr, "curl_easy_init() error.\n");
        goto out;
    }

    curl_easy_setopt(curl, CURLOPT_HEADER, 0);
    curl_easy_setopt(curl, CURLOPT_URL, url); /*Set URL*/
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
    int timeout = 5;
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);

    res = curl_easy_perform(curl);
    if(res != CURLE_OK)
    {
        fprintf(stderr, "curl_easy_perform[%d] error.\n", res);
        goto out;
    }

    curl_easy_cleanup(curl);
out:
    curl_formfree(post);
    //curl_global_cleanup();
    return 0;
}

int main(int argc, char *argv[])
{
    char buff[MAX_BUFF_LEN]={0};

    //Check Argument
    //argv[1] upload filename
    if(argc != 2)
    {
        fprintf(stderr, "Usage: %s filename\n", argv[0]);
        return 1;
    }

    //Check File Existed
    if(!check_file_existed(argv[1]))
    {
        fprintf(stderr, "File Not Existed.\n");
        return 1;
    }

    //Check File Size
    if( get_file_size(argv[1]) >= MAX_BUFF_LEN)
    {
        fprintf(stderr, "File Size is Big!\n");
        return 1;
    }

    //POST File
    http_post_file(POST_URL, argv[1]);

    return 0;
}

参考:
http://www.maycode.com/index.php/linux/54-linuxdevelop/1151-curl.html
http://curl.haxx.se/libcurl/c/curl_formadd.html
阅读(15373) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

tryandy2011-06-17 15:03:33

请问这个怎么测试阿 怎么知道上传对了阿?

tryandy2011-06-17 15:03:33

请问这个怎么测试阿 怎么知道上传对了阿?