>백엔드 개발 >PHP7 >php7에서 컬 파일 업로드 시 오류가 발생하면 어떻게 해야 하나요?

php7에서 컬 파일 업로드 시 오류가 발생하면 어떻게 해야 하나요?

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-08-13 09:20:282726검색

이 글에서는 php7에서 컬 파일 업로드 오류를 해결하는 방법을 소개하겠습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제