Home > Backend Development > PHP Tutorial > PHP simulates post request to send file code

PHP simulates post request to send file code

WBOY
Release: 2016-07-25 08:42:39
Original
1314 people have browsed it

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:

  1. $params1 = "test";
  2. $params2 = "@".$absolute_path;//If it is a file, the parameter is "@"+ Absolute path
  3. $post_data = array(
  4. 'params1' => $params1,
  5. 'params2' => $params2,
  6. );
  7. function postData($url, $data){
  8. $ch = curl_init();
  9. $timeout = 300;
  10. curl_setopt($ch, CURLOPT_URL, $url); //Request address
  11. //curl_setopt($ch, CURLOPT_REFERER, $ip);//Construction source
  12. curl_setopt($ch, CURLOPT_POST, true ; When CURLOPT_RETURNTRANSFER is set to 1, $head has the return value of the request
  13. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //Set the request timeout
  14. $handles = curl_exec($ch);
  15. curl_close($ch);
  16. return $ handles;
  17. }
  18. 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',
    );
  1. curl_setopt( $ch, CURLOPT_HTTPHEADER, $header);
  2. 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:

  1. function postData($url, $data = array(), $data1 = array()){
  2. $header = array(
  3. 'Content-Type: multipart/form-data',
  4. );
  5. $ch = curl_init();
  6. curl_setopt ($ch, CURLOPT_URL, $url);
  7. curl_setopt( $ch, CURLOPT_HTTPHEADER, $header);
  8. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  9. curl_setopt ($ch , CURLOPT_CONNECTTIMEOUT,10);
  10. curl_setopt ($ch, CURLOPT_BINARYTRANSFER,true);
  11. //curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);
  12. curl_custom_postfields($ch, $data, $data1);
  13. $dxycontent = curl_exec( $ch);
  14. curl_close($ch);
  15. return $dxycontent;
  16. }
  17. /**
  18. * For safe multipart POST request for PHP5.3 ~ PHP 5.4.
  19. *
  20. * @param resource $ch cURL resource
  21. * @param array $assoc "name => value"
  22. * @param array $files "name => path"
  23. * @return bool
  24. */
  25. function curl_custom_postfields($ch, array $assoc = array(), array $files = array() ) {
  26. // invalid characters for "name" and "filename"
  27. static $disallow = array("
  28. 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.
  29. php, post
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template