>  기사  >  백엔드 개발  >  PHP는 파일 코드를 보내기 위해 사후 요청을 시뮬레이션합니다.

PHP는 파일 코드를 보내기 위해 사후 요청을 시뮬레이션합니다.

WBOY
WBOY원래의
2016-07-25 08:42:391269검색

프로젝트의 필요로 인해 로컬 서버가 데이터를 받은 다음 다른 서버로 데이터를 전달해야 하므로 시뮬레이션된 게시 요청을 사용하여 데이터를 보냅니다. 물론 데이터에는 파일 스트림도 포함됩니다.

Curl은 PHP에서 가장 일반적으로 사용되는 방법 중 하나입니다.

  1. $params1 = "test"; "@".$ 절대_경로;//파일인 경우 매개변수는 "@" 절대경로
  2. $post_data = array(
  3. 'params1' => $params1,
  4. 'params2' => $params2,
  5. )
  6. function postData($url, $data){
  7. $ch = 컬_init()
  8. $timeout = 300; 컬_세톱($ch, CURLOPT_URL, $ url); //주소 요청
  9. //curl_setopt($ch, CURLOPT_REFERER, $ip);//구성 소스
  10. 컬_setopt($ch, CURLOPT_POST, true) //포스트 요청
  11. 컬_setopt($ ch, CURLOPT_BINARYTRANSFER,true ); //바이너리 스트림
  12. cur_setopt($ch, CURLOPT_POSTFIELDS, $data); //Data
  13. cur_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //CURLOPT_RETURNTRANSFER가 1로 설정된 경우 $head에는 요청된 반환 값이 있습니다
  14. 컬_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //요청 시간 초과 설정
  15. $handles = cur_exec($ch)
  16. 컬_close($ch); > $handles 반환
  17. }
  18. 코드 복사
상대방은 자바 서버인데 인터페이스만 알 뿐, 상대방이 파일 수신을 어떻게 처리하는지 모르겠습니다. 위의 방법은 win7 wamp 환경에서는 성공했지만, centOS Nginx 서버에 코드를 넣는 데 실패했다는 메시지가 반환됩니다. 패킷 캡처 분석 결과, win7 wamp가 전달한 패킷 형식과 centos nginx가 전달한 http 패킷의 형식이 다른 것으로 확인되었습니다. 일반적인 상황에서 컬은 기본적으로 content_type을 multipart/form-data로 설정합니다. 내 컴퓨터에서는 win7 wamp의 경우이지만 centos nginx에서는 application/x-www-form-urlencoded입니다. 물론 이것도 서버 구성 문제일 수도 있는데, 어디가 문제인지 모르겠습니다. 그러다가 다시 PHP 버전을 확인해 보니 역시 PHP5.3.X였는데 약간의 차이가 있었습니다. PHP 버전의 문제일 가능성도 배제할 수 없습니다. 그런 다음 코드를 추가합니다:

$header = array(
'Content-Type: multipart/form-data',
    ); CURLOPT_HTTPHEADER, $header)
  1. 코드 복사

헤더를 설정했지만 centos에서는 여전히 유효하지 않습니다. 콘텐츠 유형을 변경할 수 없다는 것은 정말 사기입니다.

나중에 기술 디렉터의 도움으로 PHP 공식 웹사이트 http://php.net/manual/en /class.curlfile.php의 링크를 읽고 공식 웹사이트의 관행에 따라 다음과 같이 요청을 게시했습니다. wamp와 centos nginx를 모두 작동했습니다. 코드를 주의 깊게 읽어본 결과, 컬 자체에서 생성된 부분을 사용하는 대신 http 요청의 본문 부분을 완전히 작성하는 방법이 있다는 것을 알게 되었습니다. 코드는 아래와 같습니다.

  1. function postData($url, $data = array(), $data1 = array()){
  2. $header = array(
  3. '컨텐트 유형: 멀티파트/폼-데이터',
  4. );
  5. $ch = 컬_init()
  6. 컬_setopt ($ch, CURLOPT_URL, $url); ch, CURLOPT_HTTPHEADER, $header);
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,10)
  9. curl_setopt($ch, CURLOPT_BINARYTRANSFER,true); // 컬_세톱($ch, CURLOPT_POSTFIELDS, $data);
  10. 컬_커스텀_포스트필드($ch, $data, $data1)
  11. $dxycontent = 컬_exec($ch)
  12. return $dxycontent;
  13. }
  14. /**
  15. * PHP5.3 ~ PHP 5.4에 대한 안전한 멀티파트 POST 요청을 위해.
  16. *
  17. * @param 리소스 $ch cURL 리소스
  18. * @param array $assoc "name => value"
  19. * @param array $files "name => path"
  20. * @return 부울
  21. */
  22. functioncurl_custom_postfields($ch, array $assoc = array(), array $files = array()) {
  23. // "이름"과 "파일 이름"에 잘못된 문자가 있습니다.
  24. static $disallow = array("
  25. 매개변수 전달은 효과가 없습니다. 파일인 경우 절대 경로 앞에 "@"가 옵니다. 유일한 차이점은 파일 데이터와 일반 데이터를 분리하기 위해 서로 다른 배열을 사용하고 http의 본문 부분을 시뮬레이션할 때 다르게 처리한다는 것입니다. 드디어 파일이 성공적으로 업로드되었습니다.
  26. PHP, 포스트
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.