解决了什么问题:curl在使用各种方式上传文件到服务器。
一般的文件上传是通过html表单进行的,通过CURL可以不经过浏览器,直接在服务器端模拟进行表单提交,完成POST数据、文件上传等功能。

服务器端PHP代码:

<?php
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 200000)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    } else {
        if (file_exists("upload/" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " already exists. ";
        } else {
            move_uploaded_file($_FILES["file"]["tmp_name"], "data/" . $_FILES["file"]["name"]);
            // echo "Stored in: " . "data/" . $_FILES["file"]["name"];
            echo "文件上传成功!";
        }
    }
} else {
    echo " 文件无效!";
}
?>

客户端提交的form:

<form action="upload.php" method="post" enctype="multipart/form-data">
                        <input type="file" name="file"/>
                        <input type="submit" class="btn btn-primary btn-large" value="上传文件" />
  </form>

在控制台使用curl上传的例子:

curl -F "action=upload.php" -F "method=post" -F "file=@/Users/mark/xx.gif" http://ylg.zs108.com:8080/tmp/upload.php

使用libcurl实现的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

#define POSTURL "http://ylg.zs108.com:8080/tmp/upload.php"
#define POSTFIELDS "?action=upload&method=post"
#define FILENAME "curlposttest.log"

size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);

int main(int argc, char *argv[]) {
    CURL *curl;
    CURLcode res;
    FILE *fptr;
    struct curl_slist *http_header = NULL;
    
    if ((fptr = fopen(FILENAME, "w")) == NULL) {
        fprintf(stderr, "fopen file error: %s\n", FILENAME);
        exit(1);
    }
    
    curl = curl_easy_init();
    
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fptr);
    
    struct curl_httppost *formpost = 0;
    struct curl_httppost *lastptr  = 0;
    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "reqformat", CURLFORM_PTRCONTENTS, "plain", CURLFORM_END);
    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "file", CURLFORM_FILE, "/Users/hanyanyan/xx.gif", CURLFORM_END);
    curl_easy_setopt(curl, CURLOPT_URL, POSTURL);
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
    
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
}

size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) {
    FILE *fptr = (FILE*)userp;
    fwrite(buffer, size, nmemb, fptr);
}  

编译方式:gcc -o curl_post_file filename.c -lcurl

后期调整:

<!DOCTYPE html>
<!-- saved from url=(0044)http://ylg.zs108.com:8080/dp/uploadtest.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta charset="UTF-8">
        <title>Document</title>
    <style type="text/css"></style></head>
    <body>
        <div class="containter-fluid">
            <div class="row-fluid">
                <div class="span8 offset2">
                    
                    <form action="http://ylg.zs108.com:8080/dp/upload.php" method="post" enctype="multipart/form-data">
                        <table cellpadding="10" border="1">
                            <tbody><tr>
                                <td>wid</td>
                                <td><input type="text" name="wid" value="dengpan"></td>
                            </tr>
                            <tr>
                                <td>text</td>
                                <td><input type="text" name="text" value="哈哈哈呵呵"></td>
                            </tr>
                            <tr>
                                <td>stime</td>
                                <td><input type="text" name="stime" value="13"></td>
                            </tr>
                            <tr>
                                <td>ssize</td>
                                <td><input type="text" name="ssize" value="15"></td>
                            </tr>
                            <tr>
                                <td>lid</td>
                                <td><input type="text" name="lid" value="2"></td>
                            </tr>
                            <tr>
                                <td>type</td>
                                <td><input type="text" name="type" value="2"></td>
                            </tr>
                            <tr>
                                <td>sound</td>
                                <td><input type="file" name="sound"></td>
                            </tr>
                            <tr>
                                <td></td>
                                <td><input type="submit" value="提交"></td>
                            </tr>
                        </tbody></table>
                    </form>
                </div>
            </div>
        </div>

</body></html>

命令行:

curl -F "method=post" -F "action=upload.php" -F "wid=dengpan" -F "text=hh" -F "stime=13" -F "ssize=15" -F "lid=2" -F "type=2" -F "sound=@/Users/hanyanyan/million.amr" http://ylg.zs108.com:8080/dp/upload.php

返回代码:
{"code":1,"result":{"sound":"http:\/\/ylg.zs108.com:8080\/dp\/data\/sounds\/1378815106-a3864fc57553bf4b299b4d4c0ce07649.amr"}}
最后在贴一段PHP上传的代码吧
需要被上传的文件需要在文件名前加上“@”以示区分,并且,文件名需要是完整路径。
以下php函数来模拟html表单的提交数据:

function uploadByCURL($post_data,$post_url){
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $post_url);
    curl_setopt($curl, CURLOPT_POST, 1 );
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl,CURLOPT_USERAGENT,"Mozilla/4.0");
    $result = curl_exec($curl);
    $error = curl_error($curl);
    return $error ? $error : $result;
}

/*函数的使用:*/

$url = "http://127.0.0.1/app.php";
$data = array(
    "username" => $username,
    "password"  => $password,
    "file1"  => "@".realpath("photo1.jpg"),
    "file2"  => "@".realpath("file2.xml")
);
print_r(uploadByCURL($data,$url));

CURL 和LIBCURL C++代码 上传本地文件,好不容易碰到了这种折腾我几天的代码的更多相关文章

  1. 用java 代码下载Samba服务器上的文件到本地目录以及上传本地文件到Samba服务器

    引入: 在我们昨天架设好了Samba服务器上并且创建了一个 Samba 账户后,我们就迫不及待的想用JAVA去操作Samba服务器了,我们找到了一个框架叫 jcifs,可以高效的完成我们工作. 实践: ...

  2. 如何用一张图片代替 'input:file' 上传本地文件??

    今天去面试,碰到了一道题,也许是因为紧张或者喝水喝多了,一时竟然没有转过弯来,回来之后一细想原来这么简单,哭笑不得,特此记录一下! 原题是这样的:  如何用一张图片代替 'input:file' 上传 ...

  3. 两种方法上传本地文件到github(转)

    自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的原因是我习惯本地编辑,完成以后再一起上传github.看过了几个教程,总结出最 ...

  4. paramiko模块的安装和使用(含上传本地文件或文件夹到服务器,以及下载服务器文件到本地)

    安装和使用分两步介绍: 介绍一下,本文的运行环境是win7 64位 和python 2.7  . 安装: WIN7_64位 安装python-ssh访问模块(paramiko)的安装教程,本人亲测下面 ...

  5. git 上传本地文件到github

    git 上传本地文件到github 1 git config --global user.name "Your Real Name" 2 git config --global u ...

  6. 两种方法上传本地文件到github

    https://www.jianshu.com/p/c70ca3a02087 自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的 ...

  7. Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    利用ssh传输文件   在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www ...

  8. Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    http://blog.csdn.net/rodulf/article/details/71169996 利用ssh传输文件 在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下 ...

  9. Git安装及密钥的生成并上传本地文件到GitHub上

    之前用的GitHub,不太熟练,一直在上传的过程中遇到了一些问题,看了网上诸多教程,总觉得很乱,特参考一些资料,总结了一篇完整的操作步骤,从下载安装到上传文件,亲测有效 1.下载Git软件:https ...

随机推荐

  1. 数塔(dp)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  2. wordpress教程之get_option()

    get_option函数的作用 如果你想开发自己的一个wordpress插件,那么也许你有些数据希望保存,这些自定义数据一起都保存在 wordpress数据库的wp_options表,wp_optio ...

  3. 开机时候系统总是提醒Android系统更新

    今天刷了个android的rom,平常没有经常刷机,对这个也不是特别了解. 但是刷完开机,显示系统升级,一开始都是18个app,后来捣鼓了几次,安装了几个常用的软件,居开机的时候,升级的app需要90 ...

  4. USB系列之八:透过ASPI执行SCSI命令

    在<USB系列之七>里我们介绍了ASPI的规范,并对一系列ASPI的命令做了测试,其中的02号命令是执行SCSI命令,我们专门在这篇文章中介绍,在<USB系列七>中,我们已经了 ...

  5. eMMC的MMC模式与SPI模式

    MMC存贮卡可以分为MMC和SPI两种工作模式,MMC模式是标准的默认模式,具有MMC的全部特性.而SPI模式则是MMC存贮卡可选的第二种模式,这个模式是MMC协议的一个子集,主要用于只需要小数量的卡 ...

  6. QTableView中嵌入复选框CheckBox 的四种方法总结

    搜索了一下,QTableView中嵌入复选框CheckBox方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简单,通常用这种方法. 第三种只适合静态显示静态数据用 第四 ...

  7. JVM命令行选项及GC日志

    转:http://blog.csdn.net/q291611265/article/details/48028189 一.设置参数 在使用eclipse编译器的时候,可以采用以下的运行方式来设置虚拟机 ...

  8. Family Tree

    Question A traditional constructing tree problem. Given a string to represent relationships, and pri ...

  9. House Robber II 解答

    Question After robbing those houses on that street, the thief has found himself a new place for his ...

  10. hdu1556 Color the ball

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...