我有使用curl上传文件的问题。我想在视频托管网站上传我的服务器文件。脚本需要Content-type: multipart/form-data
和Content-type: video/mp4
,但我不知道如何做到这一点。上传后,文件包含content type application/octet-stream
。
这是脚本
class curl
{
function __construct($use = 1)
{
$this->ch = curl_init();
if($use = 1)
{
curl_setopt ($this->ch, CURLOPT_POST, 1);
curl_setopt ($this->ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt ($this->ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($this->ch, CURLOPT_RETURNTRANSFER, 1);
}
else
{
return 'There is the possibility, that this script wont work';
}
}
function first_connect($loginform,$logindata)
{
curl_setopt($this->ch, CURLOPT_URL, $loginform);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $logindata);
}
function store()
{
$this->content = curl_exec ($this->ch);
}
function execute($page)
{
curl_setopt($this->ch, CURLOPT_URL, $page);
$this->content = curl_exec ($this->ch);
}
function close()
{
curl_close ($this->ch);
}
function __toString()
{
return $this->content;
}
function upload($file)
{
curl_setopt($this->ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
curl_setopt($this->ch, CURLOPT_URL, 'http://uploadsite.com/index.php?act=files&do=upload');
$postdata = array("file[]" => "@/".realpath($file));
echo $postdata;
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $postdata);
curl_exec ($this->ch);
}
}
$getit = new curl();
$getit->first_connect('http://uploadsite.com/index.php?act=login&login=true','login=true&file_session=&email=xxx%40yahoo.de&password=xxx&upload=Login');
$getit->store();
$getit->execute('http://uploadsite.com/index.php?act=user&do=home');
$getit->upload('Sample.mp4');
来自livehttpheaders
http://uploadsite.com/index.php?act=files&do=upload
POST /index.php?act=files&do=upload HTTP/1.1
Host: yourupload.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1
Accept: text/javascript, text/html, application/xml, text/xml, */*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://yourupload.com/index.php?act=user&do=home
Content-Length: 41648931
Content-Type: multipart/form-data; boundary=---------------------------265001916915724
Cookie: _pk_ref.9.d1ba=%5B%22%22%2C%22%22%2C1347200605%2C%22http%3A%2F%2F62.75.242.162%2Findex.php%22%5D; _pk_id.9.d1ba=08e499ca1b88c81c.1345157523.12.1347203814.1347189831.; PHPSESSID=jjajqi2mi7fe1blso5qvge9ue5; _pk_ses.9.d1ba=*; member_id=3051; member_pass=xxx
Pragma: no-cache
Cache-Control: no-cache
-----------------------------265001916915724
Content-Disposition: form-data; name="file[]"; filename="Sample.mp4"
Content-Type: video/mp4
HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Sun, 09 Sep 2012 15:23:56 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.3.3-7+squeeze13
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
答案 0 :(得分:9)
替换此行:
$postdata = array("file[]" => "@/".realpath($file));
使用:
$postdata = array("file[]" => "@/".realpath($file).";type=video/mp4");
它应该有用。
答案 1 :(得分:1)
我使用curl连接Web服务并使用与此帖相似的想法上传文件,但它不起作用。与前一个答案不同的原因,所以我将描述我的解决方案;也许我的经历对其他人有用。
我有两个问题。第一个是我的Web服务不喜欢文件名中的绝对路径。如果OP代码中的$ file有路径,则使用:$postdata = array('file[]' => "@/".realpath($file));
变为:
Content-Disposition: form-data; name="file[]"; filename="/tmp/iy56ham"
并且该路径生成了一个不良请求。所以我不得不使用chdir,basename和dirname以避免在$ postdata中使用路径。
另一方面,curl发送了一个额外的标题,未在OP中显示:
Expect: 100-continue
我的网络服务不喜欢它(既不是推特WS),也用它来回答:
417 Expectation Failed
为避免卷曲发送有问题的标题,您可以使用:
curl_setopt( $curlHandler, CURLOPT_HTTPHEADER, array('Expect:') );
所以你设置一个空的Expect标题,curl不会被100-continue覆盖。
希望这有助于某人...