프로젝트의 필요로 인해 로컬 서버가 데이터를 받은 다음 다른 서버로 데이터를 전달해야 하므로 시뮬레이션된 게시 요청을 사용하여 데이터를 보냅니다. 물론 데이터에는 파일 스트림도 포함됩니다.
Curl은 PHP에서 가장 일반적으로 사용되는 방법 중 하나입니다.
- $params1 = "test"; "@".$ 절대_경로;//파일인 경우 매개변수는 "@" 절대경로
- $post_data = array(
- 'params1' => $params1,
- 'params2' => $params2,
- )
- function postData($url, $data){
- $ch = 컬_init()
- $timeout = 300; 컬_세톱($ch, CURLOPT_URL, $ url); //주소 요청
- //curl_setopt($ch, CURLOPT_REFERER, $ip);//구성 소스
- 컬_setopt($ch, CURLOPT_POST, true) //포스트 요청
- 컬_setopt($ ch, CURLOPT_BINARYTRANSFER,true ); //바이너리 스트림
- cur_setopt($ch, CURLOPT_POSTFIELDS, $data); //Data
- cur_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //CURLOPT_RETURNTRANSFER가 1로 설정된 경우 $head에는 요청된 반환 값이 있습니다
- 컬_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //요청 시간 초과 설정
- $handles = cur_exec($ch)
- 컬_close($ch); > $handles 반환
- }
-
-
- 코드 복사
상대방은 자바 서버인데 인터페이스만 알 뿐, 상대방이 파일 수신을 어떻게 처리하는지 모르겠습니다. 위의 방법은 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) -
-
- 코드 복사
-
헤더를 설정했지만 centos에서는 여전히 유효하지 않습니다. 콘텐츠 유형을 변경할 수 없다는 것은 정말 사기입니다.
나중에 기술 디렉터의 도움으로 PHP 공식 웹사이트 http://php.net/manual/en /class.curlfile.php의 링크를 읽고 공식 웹사이트의 관행에 따라 다음과 같이 요청을 게시했습니다. wamp와 centos nginx를 모두 작동했습니다. 코드를 주의 깊게 읽어본 결과, 컬 자체에서 생성된 부분을 사용하는 대신 http 요청의 본문 부분을 완전히 작성하는 방법이 있다는 것을 알게 되었습니다. 코드는 아래와 같습니다.
- function postData($url, $data = array(), $data1 = array()){
- $header = array(
- '컨텐트 유형: 멀티파트/폼-데이터',
- );
- $ch = 컬_init()
- 컬_setopt ($ch, CURLOPT_URL, $url); ch, CURLOPT_HTTPHEADER, $header);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,10)
- curl_setopt($ch, CURLOPT_BINARYTRANSFER,true); // 컬_세톱($ch, CURLOPT_POSTFIELDS, $data);
- 컬_커스텀_포스트필드($ch, $data, $data1)
- $dxycontent = 컬_exec($ch)
- return $dxycontent;
- }
-
- /**
- * PHP5.3 ~ PHP 5.4에 대한 안전한 멀티파트 POST 요청을 위해.
- *
- * @param 리소스 $ch cURL 리소스
- * @param array $assoc "name => value"
- * @param array $files "name => path"
- * @return 부울
- */
- functioncurl_custom_postfields($ch, array $assoc = array(), array $files = array()) {
- // "이름"과 "파일 이름"에 잘못된 문자가 있습니다.
- static $disallow = array("
- 매개변수 전달은 효과가 없습니다. 파일인 경우 절대 경로 앞에 "@"가 옵니다. 유일한 차이점은 파일 데이터와 일반 데이터를 분리하기 위해 서로 다른 배열을 사용하고 http의 본문 부분을 시뮬레이션할 때 다르게 처리한다는 것입니다. 드디어 파일이 성공적으로 업로드되었습니다.
-
-
-
-
PHP, 포스트
-
-
-
-
-
-
-
-
|