200分求助CURL设置HTTPHEADER上传文件问题!

skyaspnet 2012-04-09 09:13:44
加精
哪位大侠有使用CURL设置HTTPHEADER来上传文件的经验?

求指点

PS:不是 '@'.文件名,而是Content-Type: application/octet-stream
...全文
11371 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_17167775 2014-08-01
  • 打赏
  • 举报
回复
引用 24 楼 skyaspnet 的回复:
[Quote=引用 21 楼 的回复:] 上次好像看到你问的是一个文件切分多份,然后上传,如果是这样的话,你要要做的只是用boundary标识多个上传内容区块。比如 PHP code $boundary = md5(time()); $postStr = ""; $postStr .="--".$boundary."\r\n"; $postStr .="Content-Disposition: form-data; name=…… [/Quote] 我用了个循环来做
可否看一下你的php代码呢?
海洋_YY 2013-09-02
  • 打赏
  • 举报
回复
果断的收了!
hage11 2012-10-18
  • 打赏
  • 举报
回复
犯得上赶得上
heloojason 2012-04-17
  • 打赏
  • 举报
回复
我之前用VC做过,很简单
curl -F updatefile=@D:\node\app_lzma.rs232 -F Upgrade=update http://192.168.1.1/goform/SoftUpdateForm

“http://192.168.1.1/goform/SoftUpdateForm”这个是我代码中表单的action
franzhong 2012-04-17
  • 打赏
  • 举报
回复
不错收藏下
个人觉得socket常规一些 and
http协议不太"擅长"这些时时大数据处理
houkehong 2012-04-17
  • 打赏
  • 举报
回复
反攻倒算v才不呢
pzhuyy 2012-04-17
  • 打赏
  • 举报
回复
用socket + http post应该可以的。
sjq153740486 2012-04-15
  • 打赏
  • 举报
回复
这么贵啊 给200分啊
QQ551780977 2012-04-14
  • 打赏
  • 举报
回复
我最近也在用CURL做一个下载客户端,欢迎一起交流下
Q群49184341
QQ551780977 2012-04-14
  • 打赏
  • 举报
回复
http://blog.csdn.net/JGood/article/details/4787670
这里有教程,有你需要的
摘录一些

上面介绍的两种方式,可以完成大部分的HTTP POST操作。但上面的两种方式都不支持multi-part formposts。Multi-part formposts被认为是提交二进制数据(或大量数据)的更好方法,可以在RFC1867, RFC2388中找到他们的定义。何为Multi-part?其实,就我理解,就是在Post提交的时候,有不同的数据单元,每个单元有自己的名称与内容,内容可以是文本的,也可以是二进制的。同时,每个数据单元都可以有自己的消息头,MIME类型,这些数据单元组成一个链表,提交到HTTP服务器。libcurl提供了方便的api用于支持multi-part formposts。使用curl_formadd函数,可以添加不同的数据数据单元,然后提交到服务器。下面是一个multi-part formposts的例子(更详细的使用,请参考:http://curl.haxx.se/libcurl/c/curl_formadd.html ):



int main()
{ curl_global_init(CURL_GLOBAL_WIN32);
CURL *easy_handle = curl_easy_init();

// 使用multi-parts form post
curl_easy_setopt(easy_handle, CURLOPT_URL, http://localhost:2210/Default.aspx); curl_httppost *post = NULL; curl_httppost *last = NULL;
// 文本数据
curl_formadd(&post, &last, CURLFORM_COPYNAME, "name", CURLFORM_COPYCONTENTS, "JGood", CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "address", CURLFORM_COPYCONTENTS, "HangZhou", CURLFORM_END);
// 文本文件中的数据
curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILECONTENT, "ReadMe.txt", CURLFORM_END);
curl_easy_setopt(easy_handle, CURLOPT_HTTPPOST, post);
curl_easy_perform(easy_handle);
curl_formfree(post);
curl_easy_cleanup(easy_handle);
curl_global_cleanup();

return 0;
}
//最后要说明的是,所有在easy handle上设置的属性都是”sticky”的,什么意思?就是说在easy handle上设置的属性都将被保存,即使执行完curl_easy_perform之后,这些属性值仍然存在。通过将CURLOPT_HTTPGET设为1可以使easy handle回到最原始的状态:

curl_easy_setopt(easy_handle, CURLOPT_HTTPGET, 1L);

gaohui_2009_happy 2012-04-13
  • 打赏
  • 举报
回复
模拟上传 啊,这个东西 最好实力说话,不过按理说不是难懂的东西,你是不是刚接触啊
小昌 2012-04-13
  • 打赏
  • 举报
回复
头面都有相应的方法setXXX();
lyf22614566 2012-04-11
  • 打赏
  • 举报
回复
不错!!!!!!
wz1whj 2012-04-11
  • 打赏
  • 举报
回复
我也要一份
skyaspnet 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

原来这样就有 type了PHP code
$varname = 'my';
$name = '3.txt';
$type = 'text/plain';
$key = <<< TEXT
$varname"; filename="$name
Content-Type: $type

TEXT;
$fields[$key] = $contents;


注意:我是在 win 下的,linux 下……
[/Quote]

很感谢,有没有比较完整的CURL 通过拼接HTTPHEADER信息上传的POST示例呢?
xuzuning 2012-04-10
  • 打赏
  • 举报
回复
原来这样就有 type了
$varname = 'my';
$name = '3.txt';
$type = 'text/plain';
$key = <<< TEXT
$varname"; filename="$name
Content-Type: $type

TEXT;
$fields[$key] = $contents;

注意:我是在 win 下的,linux 下要将 \n 换成 \r\n
没办法,早年的 sun 是拼不过 ms 的,现在也不行吧?

一直以为上传的文件类型是 php 识别的,却原来是浏览器提供的
xuzuning 2012-04-10
  • 打赏
  • 举报
回复
知道了,这样写就可以!
$contents =<<< 'TEXT'
数据报中应该是
Content-Disposition: form-data; name="userfile"; filename="file_name"
Content-Type: 文档类型

文件内容

这样的格式,我只实现了文件名部分,文档类型不知道如何实现。
这样上传后就取不到 type 的值

curl_upload_server.php
<xmp>
<?php
print_r($_FILES);

echo "文件内容:\n";
$p = current($_FILES);
readfile($p['tmp_name']);

TEXT;

$fields['f"; filename="x.x'] = $contents; //这个关联键的写法很怪异吧?

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://localhost/curl_upload_server.php");
curl_setopt($ch, CURLOPT_POST, 1 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$s = curl_exec ($ch);
curl_close ($ch);

echo $s;
xuzuning 2012-04-10
  • 打赏
  • 举报
回复
可能是比较复杂吧,所以 curl 提供了 '@'.文件名 的方式。把构造头和数据的工作留给了自己

但 curl 依然提供了 CURLOPT_UPLOAD 来表示上传文件,但实际上使用了 PUT 请求
只适合向 ftp 上传文件
在 php 中,要从 php://input 读取

使用 #5 给出的代码,会产生 无法识别的请求 这样的错误,注释掉文件上传的那段,依然报这个错。不知是什么原因
但对比 curl PUT 方式的数据报,似乎也没有什么差异

haining007a 2012-04-10
  • 打赏
  • 举报
回复
我只用过Content-Type提供下载.
skyaspnet 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

http://cn.php.net/fsockopen
CTRL + F搜索boundary,例子好好看看,构建一个文件上传的http请求头即可,按理说CURL构建同样的请求头应该也没问题。
[/Quote]

谢谢,CURL不支持这种上传方法吗?
加载更多回复(31)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧