Due to the needs of the project, the local server needs to receive the data and then forward the data to another server, so a simulated post request is used to send the data. Of course, the data also includes file streams.
curl is one of the more commonly used methods in PHP. The general code is as follows:
- $params1 = "test";
- $params2 = "@".$absolute_path;//If it is a file, the parameter is "@"+ Absolute path
- $post_data = array(
- 'params1' => $params1,
- 'params2' => $params2,
- );
- function postData($url, $data){
- $ch = curl_init();
- $timeout = 300;
- curl_setopt($ch, CURLOPT_URL, $url); //Request address
- //curl_setopt($ch, CURLOPT_REFERER, $ip);//Construction source
- curl_setopt($ch, CURLOPT_POST, true ; When CURLOPT_RETURNTRANSFER is set to 1, $head has the return value of the request
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //Set the request timeout
- $handles = curl_exec($ch);
- curl_close($ch);
- return $ handles;
- }
-
-
- Copy code
The other party is a java server. I only know the interface, but I don’t know how the other party handles file reception. The above method is successful in the win7 wamp environment, but when the code is placed on the centOS+Nginx server, it fails. The returned message is that the file reception failed. After packet capture analysis, it was found that the format of the packets delivered by win7 wamp and the http packets delivered by centos nginx were different. Under normal circumstances, curl sets the content_type to multipart/form-data by default. On my machine, this is the case under win7 wamp, but under centos nginx, it is application/x-www-form-urlencoded. Of course, this may also be a server configuration problem, but I don't know where the problem is. Then I checked the PHP version again. It was also PHP5.3.X, but there were slight differences. It does not rule out that it is a problem with the PHP version. Then add the code:
$header = array( 'Content-Type: multipart/form-data', ); - curl_setopt( $ch, CURLOPT_HTTPHEADER, $header);
-
-
- Copy code
Set header, but it is still invalid under centos. It's really a scam that I can't change the content-type.
Later, with the help of the technical director, I read a link on the official PHP website http://php.net/manual/en /class.curlfile.php. According to the official website’s practices, post requests were successful under win wamp and centos nginx. . After reading the code carefully, I found that the method is to completely write the body part of the http request instead of using the part generated by curl itself. I have to admire it. The code is released below:
- function postData($url, $data = array(), $data1 = array()){
- $header = array(
- 'Content-Type: multipart/form-data',
- );
- $ch = curl_init();
- curl_setopt ($ch, CURLOPT_URL, $url);
- curl_setopt( $ch, CURLOPT_HTTPHEADER, $header);
- curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt ($ch , CURLOPT_CONNECTTIMEOUT,10);
- curl_setopt ($ch, CURLOPT_BINARYTRANSFER,true);
- //curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);
- curl_custom_postfields($ch, $data, $data1);
- $dxycontent = curl_exec( $ch);
- curl_close($ch);
- return $dxycontent;
- }
-
- /**
- * For safe multipart POST request for PHP5.3 ~ PHP 5.4.
- *
- * @param resource $ch cURL resource
- * @param array $assoc "name => value"
- * @param array $files "name => path"
- * @return bool
- */
- function curl_custom_postfields($ch, array $assoc = array(), array $files = array() ) {
- // invalid characters for "name" and "filename"
- static $disallow = array("
- Parameter passing has no effect. If it is a file, add "@" before the absolute path. The only difference is to use different arrays to separate file data and ordinary data, and process them differently when simulating the body part of http. The file was finally uploaded successfully.
-
-
-
-
php, post
-
-
-
-
-
-
-
-
|