使用curl上传POST数据和文件
我想使用cURL不仅在HTTP POST中发送数据参数,而且还要上传具有特定表单名称的文件。 我应该怎么做呢?
HTTP发布参数:
userid = 12345 filecomment =这是一个图像文件
HTTPfile upload:文件位置= /home/user1/Desktop/test.jpg file = image的表单名称(对应PHP侧的$ _FILES ['image'])
我认为cURL命令的一部分如下:
curl -d "userid=1&filecomment=This is an image file" --data-binary @"/home/user1/Desktop/test.jpg" localhost/uploader.php
我得到的问题如下:
Notice: Undefined index: image in /var/www/uploader.php
问题是我正在使用$ _FILES ['image']来获取PHP脚本中的文件。
如何相应地调整我的cURL命令?
您需要使用-F
选项:
-F/--form <name=content> Specify HTTP multipart POST data (H)
尝试这个:
curl \ -F "userid=1" \ -F "filecomment=This is an image file" \ -F "image=@/home/user1/Desktop/test.jpg" \ localhost/uploader.php
将用户标识捕获为pathvariables(推荐):
curl -i -X POST -H "Content-Type: multipart/form-data" -F "data=@test.mp3" http://mysuperserver/media/1234/upload/
捕获用户ID作为表单的一部分:
curl -i -X POST -H "Content-Type: multipart/form-data" -F "data=@test.mp3;userid=1234" http://mysuperserver/media/upload/
这是我的解决scheme,我一直在阅读很多post,他们真的很有帮助。 最后我写了一些小文件的代码,用cURL和PHP,我认为它非常有用。
public function postFile() { $file_url = "test.txt"; //here is the file route, in this case is on same directory but you can set URL too like "http://examplewebsite.com/test.txt" $eol = "\r\n"; //default line-break for mime type $BOUNDARY = md5(time()); //random boundaryid, is a separator for each param on my post curl function $BODY=""; //init my curl body $BODY.= '--'.$BOUNDARY. $eol; //start param header $BODY .= 'Content-Disposition: form-data; name="sometext"' . $eol . $eol; // last Content with 2 $eol, in this case is only 1 content. $BODY .= "Some Data" . $eol;//param data in this case is a simple post data and 1 $eol for the end of the data $BODY.= '--'.$BOUNDARY. $eol; // start 2nd param, $BODY.= 'Content-Disposition: form-data; name="somefile"; filename="test.txt"'. $eol ; //first Content data for post file, remember you only put 1 when you are going to add more Contents, and 2 on the last, to close the Content Instance $BODY.= 'Content-Type: application/octet-stream' . $eol; //Same before row $BODY.= 'Content-Transfer-Encoding: base64' . $eol . $eol; // we put the last Content and 2 $eol, $BODY.= chunk_split(base64_encode(file_get_contents($file_url))) . $eol; // we write the Base64 File Content and the $eol to finish the data, $BODY.= '--'.$BOUNDARY .'--' . $eol. $eol; // we close the param and the post width "--" and 2 $eol at the end of our boundary header. $ch = curl_init(); //init curl curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'X_PARAM_TOKEN : 71e2cb8b-42b7-4bf0-b2e8-53fbd2f578f9' //custom header for my api validation you can get it from $_SERVER["HTTP_X_PARAM_TOKEN"] variable ,"Content-Type: multipart/form-data; boundary=".$BOUNDARY) //setting our mime type for make it work on $_FILE variable ); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/1.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'); //setting our user agent curl_setopt($ch, CURLOPT_URL, "api.endpoint.post"); //setting our api post url curl_setopt($ch, CURLOPT_COOKIEJAR, $BOUNDARY.'.txt'); //saving cookies just in case we want curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // call return content curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); navigate the endpoint curl_setopt($ch, CURLOPT_POST, true); //set as post curl_setopt($ch, CURLOPT_POSTFIELDS, $BODY); // set our $BODY $response = curl_exec($ch); // start curl navigation print_r($response); //print response }
有了这个,我们应该得到“api.endpoint.post”下面的variables。 你可以很容易地testing这个脚本,你应该在最后一行的函数postFile()
上接受这个debugging。
print_r($response); //print response public function getPostFile() { echo "\n\n_SERVER\n"; echo "<pre>"; print_r($_SERVER['HTTP_X_PARAM_TOKEN']); echo "/<pre>"; echo "_POST\n"; echo "<pre>"; print_r($_POST['sometext']); echo "/<pre>"; echo "_FILES\n"; echo "<pre>"; print_r($_FILEST['somefile']); echo "/<pre>"; }
它应该工作得很好,它们可能是更好的解决scheme,但是这个工作并且对于理解边界和多部分/从数据MIME如何在PHP和cURL库上工作是非常有帮助的。
这里是如何正确使用bash
转义上传文件的任意文件名:
#!/bin/bash set -eu f="$1" f=${f//\\/\\\\} f=${f//\"/\\\"} f=${f//;/\\;} curl --silent --form "uploaded=@\"$f\"" "$2"
官方的Vimeo PHP库提供了一个命令行上传器,它使用了一个更稳定的上传工作stream程。
该文件在这里: https : //github.com/vimeo/vimeo.php/blob/master/example/upload.php,并要求你创build一个类似于这样的config.json文件: https : //github.com/ vimeo / vimeo.php / blob / master / example / config.json.example与您的访问令牌。
一旦设置,你可以上传一个video与php upload.php ~/video.mp4