一、客户端文件上传

  libcurl上传文件有两种方式:

  1、直接上传文件,类似form表单<input type=”file” />,<form enctype=”multipart/form-data”…;

  2、上传二进制流;

设定自定义头,都是使用一样的方法


struct curl_slist *headers=NULL;
headers = curl_slist_append(headers, "Content-Type: text/xml");
headers = curl_slist_append(headers, "Accept: text/html, */*;q=0.01");
//... //set headers
curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers); //last free the header list
curl_slist_free_all(headers); /* free the header list */ 

附上开发中写的程序代码

 int UploadFile(char *file_name, char *dir_name, char *save_name)
{
char buff[];
CURL *curl; CURLM *multi_handle;
int still_running; struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL;
static const char buf[] = "Expect:"; sprintf(buff, "%s%s%s%s", dir_name, "-", save_name, ".jpg");
/* Fill in the file upload field. This makes libcurl load data from
the given file name when curl_easy_perform() is called. */
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "file",
CURLFORM_FILE, file_name,
CURLFORM_CONTENTTYPE, "Image/jpeg",
CURLFORM_FILENAME, buff,
CURLFORM_END); /* Fill in the filename field */
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "filename",
CURLFORM_COPYCONTENTS, save_name,
CURLFORM_END); /* Fill in the submit field too, even if this is rarely needed */
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "directory",
CURLFORM_COPYCONTENTS, dir_name,
CURLFORM_END); curl = curl_easy_init();
multi_handle = curl_multi_init(); /* initalize custom header list (stating that Expect: 100-continue is not
wanted */
headerlist = curl_slist_append(headerlist, buf);
if(curl && multi_handle) { /* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, "https://app.sopings.com/lock/control/_UploadFile.php");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); if () {
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, );
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, );
} curl_multi_add_handle(multi_handle, curl); curl_multi_perform(multi_handle, &still_running); do {
struct timeval timeout;
int rc; /* select() return code */ fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -; long curl_timeo = -; FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep); /* set a suitable timeout to play around with */
timeout.tv_sec = ;
timeout.tv_usec = ; curl_multi_timeout(multi_handle, &curl_timeo);
if(curl_timeo >= ) {
timeout.tv_sec = curl_timeo / ;
if(timeout.tv_sec > )
timeout.tv_sec = ;
else
timeout.tv_usec = (curl_timeo % ) * ;
} /* get file descriptors from the transfers */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); /* In a real-world program you OF COURSE check the return code of the
function calls. On success, the value of maxfd is guaranteed to be
greater or equal than -1. We call select(maxfd + 1, ...), specially in
case of (maxfd == -1), we call select(0, ...), which is basically equal
to sleep. */ rc = select(maxfd+, &fdread, &fdwrite, &fdexcep, &timeout); switch(rc) {
case -:
/* select error */
break;
case :
default:
/* timeout or readable/writable sockets */
printf("perform!\n");
curl_multi_perform(multi_handle, &still_running);
printf("running: %d!\n", still_running);
break;
}
} while(still_running); curl_multi_cleanup(multi_handle); /* always cleanup */
curl_easy_cleanup(curl); /* then cleanup the formpost chain */
curl_formfree(formpost); /* free slist */
curl_slist_free_all (headerlist);
}
return ;
}

服务器端的接收代码(PHP)

<?php

require_once (__DIR__."/../libs/Error.php");
include_once (__DIR__."/../db/Db.php");
/**
* 上传文件
* @author 戴栋根
* @version 1.0
* @created 16-三月-2016
*/
if ((($_FILES["file"]["type"] == "Image/png")
|| ($_FILES["file"]["type"] == "Image/jpeg")
|| ($_FILES["file"]["type"] == "Image/pjpeg"))
&& ($_FILES["file"]["size"] < 10000000))
{
if ($_FILES["file"]["error"] > 0)
{
echo Error::getRetString(10021);
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if (!file_exists($_FILES["directory"]["type"]))
{
mkdir ($_FILES["directory"]["type"]);
} if (file_exists($_FILES["directory"]["type"]."/" . $_FILES["filename"]["type"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
$_FILES["directory"]["type"]."/" . $_FILES["filename"]["type"]);
echo "Stored in: " . $_FILES["directory"]["type"]."/" . $_FILES["filename"]["type"];
}
}
}
else
{
echo Error::getRetString(10007);
}
?>

libcurl开发文档链接

openwrt通过libcurl上传图片,服务器端通过PHP接收文件的更多相关文章

  1. python requests上传文件 tornado 接收文件

    requests 上传文件 import requests def images(): url = 'http://127.0.0.1:8889/upload/image' files = {'fil ...

  2. SpringBoot RestTemplate接收文件,并将文件发送到另外一个程序进行存储

    最近有个需求,接收用户上报的证书,并且保存起来,证书大小不到1M,但该证书的保存必须在另外一个程序进行,所以想到使用springboot接收上传文件后,再通过RestTemplate将文件发送给另外一 ...

  3. 应用SecureCRT(发送接收文件)

    使用 SecureCRT 和 cz. sz,可以从 Linux 服务器上下载/上传文件. Linux 上要安装 lszrz 包 (1)编译安装root 账号登陆后,依次执行以下命令 cd /tmp w ...

  4. 在Django中接收文件并存储

    首先是一个views函数的例子 def get_user_profiles(request): if request.method == 'POST': myFile = request.FILES. ...

  5. django设置并获取cookie/session,文件上传,ajax接收文件,post/get请求及跨域请求等的方法

    django设置并获取cookie/session,文件上传,ajax接收文件等的方法: views.py文件: from django.shortcuts import render,HttpRes ...

  6. 需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP

    需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP 需求:过滤下面这个网页里共723行 校对中里 行数为两位数 ...

  7. C#网络编程(接收文件) - Part.5

    这篇文章将完成 Part.4 中剩余的部分,它们本来是一篇完整的文章,但是因为上一篇比较长,合并起来页数太多,浏览起来可能会比较不方便,我就将它拆为两篇了,本文便是它的后半部分.我们继续进行上一篇没有 ...

  8. js接收文件流并下载

    js接收文件流并下载 标签(空格分隔): js 在此输入正文 <script type="text/javascript"> function download(fil ...

  9. 百度编辑器ueditor批量上传图片或者批量上传文件时,文件名称和内容不符合,错位问题

    百度编辑器ueditor批量上传附件时,上传后的文件和实际文件名称错误,比如实际是文件名“dongcoder.xls”,上传后可能就成了“懂客.xls”.原因就是,上传文件时是异步上传,同时进行,导致 ...

随机推荐

  1. 解决input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能

    最近做项目遇到: 背景:点击单元格,easyUI自动生成input可编辑框. 问题点:input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能 要实现需求: 1.回车键 ...

  2. 第一章Python起步

    1.1搭建编程环境 编程环境的正确搭建很重要,一定要参考先搭配好环境变量,不然用着会很麻烦,在这里推荐使用工具pycharm,亿图图示画流程图,一定要正确安装,搭配好环境变量,后面要添加很多模块,前期 ...

  3. nmap安装过程

    nmap是一个网络扫描和主机检测工具. 功能:1.扫描目标主机开放的端口 2.扫描目标主机特定端口是否关闭 3.路由跟踪(到目标主机所经过的网络节点及其通过时间) 4.扫描一个网段下的所有IP 5.探 ...

  4. nfs服务端配置文件详解

    配置参数语法 配置文件路径 /etc/exports 可以使用#进行注释说明 一个完整的配置实例至少需要3个参数 1.被共享的目录 必须是存在的目录 2.向谁共享 可以指定主机或网络范围,支持通配符* ...

  5. Oracle存储过程的调用和执行

    1.什么是存储过程: 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 2.无参存储过程的使用: Normal 0 7.8 磅 0 2 fals ...

  6. C#中关于WebBrowser的一些细节设置

    在winform中有一个控件可以显示html的内容,该控件就是webbrowser,设置它的DocumenText属性为HTML的内容即可. 在使用WebBrowser做UI的时候,我们有时不希望里面 ...

  7. Android实现网络多线程断点续传下载

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多 ...

  8. 第一章开发简单的Java应用程序

    1.什么是程序? 程序一词来源于生活,通俗点讲就是把生活的的事用程序编写出来 并执行. 2.为什么要学习Java呢? Java是Sun Microsystems于1995年推出的高级编程语言 Java ...

  9. jmeter 使用jmeter 录制web脚本

    1.打开jmeter.鼠标右击工作台.添加HTTP代理服务器 2.设置端口号.目标控制器.分组 3.添加查看结果树 4.点击启动.确定完成 5.打开浏览器直接进行操作.就可以看到所录制的脚本信息

  10. children 和childNodes 的区别

    1:childNodes /children相同点:它返回指定元素的子元素集合. 2:区别:children :  它是非标准的,仅返回HTML节点.甚至不返回文本节点.所有浏览器表现一 致. chi ...