이 글에서는 php7에서 컬 파일 업로드 오류를 해결하는 방법을 소개하겠습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
최근 프로젝트가 컬 포스트 방식을 사용하여 WeChat 공개 계정의 자료 라이브러리 인터페이스에 연결되어 자료 파일을 제출했는데 계속해서
{"errcode": 41005, "errmsg" 메시지가 표시되는 것을 발견했습니다. : "미디어 데이터 누락" }
코드 내용
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => '@' . $fileName, 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); $data = is_array($data) ? http_build_query($data) : $data; curl_setopt(self::$curl, CURLOPT_POST, 1); curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
공식 문서를 확인한 결과 php5.5 이후에는 @가 더 이상 지원되지 않습니다. CurlFile을 사용하거나 CURLOPT_SAFE_UPLOAD를 1
멀티파트에 "@" 문제가 있습니다.
PHP 5.5 이상용 솔루션:
CURLOPT_SAFE_UPLOAD를 활성화합니다.
"@" 대신 CURLFile을 사용합니다.
php7에서는 CURLOPT_SAFE_UPLOAD를 변경하면 다음과 같은 오류 메시지가 표시됩니다.
curl_setopt(): 안전한 업로드 비활성화 오류에서는 더 이상 지원되지 않습니다
CurlFile을 사용하여 정직하게 처리할 수만 있습니다
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => new \CURLFile($fileName), 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); $data = is_array($data) ? http_build_query($data) : $data; curl_setopt(self::$curl, CURLOPT_POST, 1); curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
그런 다음 이렇게 작성하면서 세 가지 큰 함정을 발견했습니다(나는 바보입니다)
1 CURLOPT_POSTFILEDS가 배열 content_type에 전달되는 경우 , CURLOPT_POSTFILEDS가 전달되는 경우 입력이 json이거나 key-value이고 content_type이 x-www-form_urlencoded인 경우, WeChat은 form-data에 의해 전달된 배열을 지원합니다.
2. 배열에서 http_build_query는 이를 배열로 변경합니다
3. CurlFile은 서버의 경로만 읽을 수 있습니다. 인터넷에 주소를 업로드하려면 먼저 서버의 임시 디렉터리에 다운로드해야 합니다. 그런 다음 CurlFile
을 통해 파일 경로(절대 경로)를 읽습니다.그러면 코드를 조정합니다
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => new \CURLFile($fileName), 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); curl_setopt(self::$curl, CURLOPT_POST, 1); curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
맞습니다. 제거할 수 있다고 생각했을 때 php7에서 알림 구문 오류가 나타났습니다.
Array to 문자열 변환
그러다가 정보를 확인해보니 CURLOPT_POSTFIEDLDS가 다차원 배열을 지원하지 않는 것으로 나타났습니다
하지만 알림 메시지의 구문 오류로 인해 완전히 차단할 수 있습니다
코드를 계속 조정하세요
$url = self::$add_material . $accessToken . '&type=' . $key; $data = [ 'media' => new \CURLFile($fileName), 'form-data' => $fileInfo, 'description' => json_encode([ 'title' => $fileName, 'introduction' => '' ]), ]; self::init($url); curl_setopt(self::$curl, CURLOPT_POST, 1); @curl_setopt(self::$curl, CURLOPT_POSTFIELDS, $data); $info = curl_exec(self::$curl); curl_close(self::$curl);
드디어 자료가 나왔습니다 업로드 성공
위를 보니 벌써 어두워졌네요
너무 기뻐서 얼른 코 닦고 짐 챙겨서 퇴근했어요
추천 학습: php 동영상 튜토리얼
위 내용은 php7에서 컬 파일 업로드 시 오류가 발생하면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!