백엔드 개발 PHP 튜토리얼 PHP5.0~5.6 다양한 버전 호환 cURL 파일 업로드 기능

PHP5.0~5.6 다양한 버전 호환 cURL 파일 업로드 기능

Jun 01, 2018 am 11:51 AM
curl

이 글에서는 주로 PHP5.0~5.6의 다양한 버전 호환성의 cURL 파일 업로드 기능을 소개하고, 다양한 일반 버전의 PHP의 컬 파일 업로드 작업에 대한 관련 구현 기술과 주의사항을 예제 형식으로 분석합니다. 필요하신 분들은 참고하시면 됩니다

이 글에서는 PHP5.0~5.6 각 버전의 호환성에 대한 cURL 파일 업로드 기능을 분석한 예시를 사용합니다. 참조용으로 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

최근 요구 사항은 PHP를 통해 cURL을 호출하여 멀티파트/양식 데이터 형식의 파일을 업로드하는 것입니다. 기사에는 몇 가지 함정이면 충분합니다.

중요 경고

PHP의 공식 중국어 문서를 읽지 마세요! 버전이 따라가지 못해서 죽게 됩니다!

다양한 PHP 버전 간 cURL의 차이점

PHP의 cURL은 (문자열 대신) 연관 배열을 CURL_POSTFIELDS에 전달하여 multipart/form-data POST 요청. <code>CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求。

传统上,PHP的cURL支持通过在数组数据中,使用“@+文件全路径”的语法附加文件,供cURL读取上传。这与命令行直接调用cURL程序的语法是一致的:

curl_setopt(ch, CURLOPT_POSTFIELDS, array(
  &#39;file&#39; => &#39;@&#39;.realpath(&#39;image.png&#39;),
));
로그인 후 복사

equals

$ curl -F "file=@/absolute/path/to/image.png" <url>
로그인 후 복사

但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@语法:

curl_setopt(ch, CURLOPT_POSTFIELDS, [
  &#39;file&#39; => new CURLFile(realpath(&#39;image.png&#39;)),
]);
로그인 후 복사

PHP 5.5另外引入了CURL_SAFE_UPLOAD选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。

但是坑的一点在于:@语法在5.5就已经被打了deprecated,在5.6中就直接被删除了(会产生 ErorException: The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead)。

对于PHP 5.6+而言,手动设置CURL_SAFE_UPLOAD为false是毫无意义的。根本不是字面意义理解的“设置成false,就能开启旧的unsafe的方式”——旧的方式已经作为废弃语法彻底不存在了。PHP 5.6+ == CURLFile only,不要有任何的幻想。

我的部署环境是5.4(仅@语法),但开发环境是5.6(仅CURLFile)。都没有压在5.5这个两者都支持过渡版本上,结果就是必须写出带有环境判断的两套代码。

现在问题来了……

环境判断:小心魔法数字!

我见过这种环境判断的代码:

if (version_compare(phpversion(), &#39;5.4.0&#39;) >= 0)
로그인 후 복사

我对这种代码的评价只有一个字:屎。

这个判断掉入了典型的魔法数字陷阱。版本号莫名其妙的出现在代码之中,不查半天PHP手册和更新历史,很难明白作者被卡在了哪个功能的变更上。

代码应该回归本源。我们的实际需求其实是:有CURLFile就优先采用,没有再退化到传统@语法。那么代码就来了:

if (class_exists(&#39;\CURLFile&#39;)) {
  $field = array(&#39;fieldname&#39; => new \CURLFile(realpath($filepath)));
} else {
  $field = array(&#39;fieldname&#39; => &#39;@&#39; . realpath($filepath));
}
로그인 후 복사

建议明确指定的退化选项

从可靠的角度,推荐指定CURL_SAFE_UPLOAD的值,明确告知php是容忍还是禁止旧的@语法。注意在低版本PHP中CURLOPT_SAFE_UPLOAD常量本身可能不存在,需要判断:

if (class_exists(&#39;\CURLFile&#39;)) {
  curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
  if (defined(&#39;CURLOPT_SAFE_UPLOAD&#39;)) {
    curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
  }
}
로그인 후 복사

cURL选项设置的顺序

不管是curl_setopt()单发还是curl_setopt_array()批量,cURL的选项总是设置一个生效一个,而设置好的选项立刻就会影响cURL在设置后续选项时的行为。

例如CURLOPT_SAFE_UPLOAD就和CURLOPT_POSTFIELDS的行为有关。如果先设置CURLOPT_POSTFIELDS再设置CURLOPT_SAFE_UPLOAD,那么后者的约束作用就不会生效。因为设置前者时cURL就已经把数据实际的识读处理完毕了!

cURL有那么几个选项存在这种坑,务必小心。还好这种存在“依赖关系”的选项不多,机制也不复杂,简单处理即可。我的方法是先批量设置所有的选项,然后直到curl_exec()的前一刻才用curl_setopt()单发设置CURLOPT_POSTFIELDS

전통적으로 PHP의 cURL은 cURL이 읽고 업로드할 배열 데이터에서 "@+전체 파일 경로" 구문을 사용하여 파일 첨부를 지원합니다. 이는 명령줄에서 cURL 프로그램을 직접 호출하는 구문과 일치합니다. 🎜

🎜rrreee🎜🎜🎜equals🎜

🎜rrreee🎜🎜🎜그러나 PHP는 5.5부터 도입됨 새로운 CURLFile 클래스는 파일을 가리키는 데 사용됩니다. CURLFile 클래스는 multipart/form-data 데이터에 나타날 수 있는 MIME 유형, 파일 이름 등과 같은 추가 정보를 자세히 정의할 수도 있습니다. PHP는 이전 @ 구문을 대체하기 위해 CURLFile을 사용할 것을 권장합니다. 🎜

🎜rrreee🎜🎜🎜PHP 5.5에는 CURL_SAFE_UPLOAD 옵션도 도입되었습니다. PHP cURL 모듈은 이전 @ 구문을 거부하고 CURLFile 스타일 파일만 허용합니다. 기본값은 5.5의 경우 false이고 5.6의 경우 true입니다. 🎜🎜그러나 함정은 다음과 같습니다. @ 구문은 5.5에서 더 이상 사용되지 않으며 5.6에서 직접 삭제되었습니다. (ErorException이 생성됩니다. 파일 업로드는 더 이상 사용되지 않습니다. 대신 CURLFile 클래스를 사용하세요. 🎜🎜PHP 5.6+의 경우 수동으로 CURL_SAFE_UPLOAD를 false로 설정하는 것은 의미가 없습니다. 문자 그대로 "false로 설정하면 안전하지 않은 이전 메서드가 활성화됩니다"로 이해되지 않습니다. 이전 메서드는 더 이상 사용되지 않는 구문으로 존재하지 않습니다. PHP 5.6+ == CURLFile만🎜, 어떤 환상도 갖지 마세요. 🎜🎜내 배포 환경은 5.4(@Grammar only🎜)이지만 개발 환경은 5.6(CURLFile 전용🎜)입니다. 둘 다 지원하는 과도기 버전인 5.5에는 중점을 두지 않습니다. 따라서 환경 판단이 가능한 두 가지 코드 세트를 작성해야 합니다. 🎜🎜이제 질문이 떠오릅니다... 🎜🎜🎜🎜환경 판단: 매직넘버를 조심하세요! 🎜🎜🎜🎜이런 종류의 환경 판단 코드를 본 적이 있습니다: 🎜

🎜rrreee🎜🎜🎜이런 종류의 코드에는 똥이라는 한 단어밖에 없습니다. 🎜🎜이 판단은 전형적인 매직넘버 함정에 빠지게 됩니다. 코드에 버전 번호가 설명할 수 없을 정도로 표시됩니다. PHP 매뉴얼과 업데이트 내역을 오랫동안 확인하지 않으면 작성자가 어떤 기능 변경에 매달렸는지 이해하기 어렵습니다. 🎜🎜코드는 뿌리로 돌아가야 합니다. 실제 요구 사항은 실제로 기존 @ 구문으로 회귀하지 않고 먼저 CURLFile을 사용하는 것입니다. 그러면 코드는 다음과 같습니다. 🎜

🎜rrreee🎜🎜🎜🎜🎜성능 저하 옵션을 명시적으로 지정하는 것이 좋습니다🎜🎜🎜🎜신뢰할 수 있는 관점에서 CURL_SAFE_UPLOAD, 이전 <code>@ 구문을 허용할지 금지할지 여부를 PHP에 명시적으로 알려줍니다. 하위 버전의 PHP에서는 CURLOPT_SAFE_UPLOAD 상수 자체가 없을 수도 있습니다. 다음 사항을 판단해야 합니다. 🎜

🎜rrreee🎜🎜🎜🎜🎜cURL 옵션 설정 순서🎜🎜🎜 🎜curl_setopt() 싱글 샷 또는 curl_setopt_array() 배치에 관계없이 cURL의 옵션은 항상 하나씩 적용되도록 설정되며 설정된 옵션은 다음과 같은 경우 즉시 cURL에 영향을 미칩니다. 후속 옵션을 설정합니다. 🎜🎜예를 들어 CURLOPT_SAFE_UPLOADCURLOPT_POSTFIELDS의 동작과 관련이 있습니다. CURLOPT_POSTFIELDS를 먼저 설정한 다음 CURLOPT_SAFE_UPLOAD를 설정하면 후자의 제약 조건이 적용되지 않습니다. 왜냐하면 전자를 설정할 때 cURL은 이미 데이터의 실제 읽기 및 처리를 완료했기 때문입니다! 🎜🎜cURL에는 이러한 함정이 있는 여러 옵션이 있으므로 주의하세요. 다행히도 이러한 종류의 "종속성"에 대한 옵션은 많지 않으며 메커니즘도 복잡하지 않으므로 간단하게 처리할 수 있습니다. 내 방법은 먼저 모든 옵션을 일괄 설정한 다음 curl_setopt()를 사용하여 curl_exec()직전까지 한 번에 CURLOPT_POSTFIELDS를 설정하는 것입니다. >. 🎜

실제로 curl_setopt_array()에서 사용하는 배열에서는 CURLOPT_POSTFIELDS의 위치도 뒤쪽에서도 신뢰할 수 있음이 보장됩니다. PHP의 연관 배열은 순차적으로 보장됩니다. 또한 curl_setopt_array()의 내부 실행 순서가 처음부터 끝까지 순서대로 유지되어야 한다고 가정할 수도 있습니다. 너무 단순해서 사실에 대해 최소한의 주장만 하겠으니 안심하셔도 됩니다. curl_setopt_array()用的数组中,保证CURLOPT_POSTFIELDS的位置在后边也是可靠的。PHP的关联数组是有顺序保障的,我们也可以假设curl_setopt_array()内部的执行顺序一定是从头到尾按顺序(好吧我知道assume不是件好事,不过有些实在过分浅显的事实,就容我下个最低限度的断言吧),所以尽可放心。

我的做法只是在代码表现上加个多余的保险,突出强调顺序的重要性防以后手贱。

命名空间

PHP 5.2或以下的版本没有命名空间。代码中用到了空间分隔符就会引发解析器错误。要照顾PHP 5.2其实容易想,放弃命名空间即可。

要注意的反倒是有命名空间的PHP 5.3+。无论是调用CURLFile还是用class_exists()判断CURLFile的存在性,都推荐写成CURLFile

나의 접근 방식은 코드 성능에 추가 보험을 추가하여 향후 실수를 방지하기 위한 순서의 중요성을 강조하는 것입니다.


네임스페이스

PHP 버전 5.2 이하에는 네임스페이스가 없습니다. 코드에 공백 구분 기호 를 사용하면 파서 오류가 발생합니다. 실제로 PHP 5.2를 관리하는 것은 쉽습니다. 네임스페이스를 포기하기만 하면 됩니다.

주의해야 할 것은 네임스페이스가 있는 PHP 5.3+입니다. CURLFile을 호출하든 class_exists()를 사용하여 CURLFile의 존재를 확인하든, 다음과 같은 경우 코드가 충돌하는 것을 방지하기 위해 CURLFile을 작성하여 최상위 공간을 명확하게 지정하는 것이 좋습니다. 네임스페이스에 래핑되어 있습니다.

관련 권장 사항:

php5 및 php7의 cURL 파일 업로드 기능과 호환🎜🎜🎜🎜🎜🎜🎜🎜

위 내용은 PHP5.0~5.6 다양한 버전 호환 cURL 파일 업로드 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python에서 CURL과 Python 요청 간의 상호 변환을 실현하는 방법 Python에서 CURL과 Python 요청 간의 상호 변환을 실현하는 방법 May 03, 2023 pm 12:49 PM

컬과 Pythonrequests는 모두 HTTP 요청을 보내는 강력한 도구입니다. 컬은 터미널에서 직접 요청을 보낼 수 있는 명령줄 도구인 반면, Python의 요청 라이브러리는 Python 코드에서 요청을 보내는 보다 프로그래밍적인 방법을 제공합니다. 컬을 Pythonrequestscurl 명령으로 변환하는 기본 구문은 다음과 같습니다. 컬[OPTIONS]URL 컬 명령을 Python 요청으로 변환할 때 옵션과 URL을 Python 코드로 변환해야 합니다. 다음은 컬POST 명령의 예입니다: 컬-XPOST https://example.com/api

Linux에서 컬 버전을 업데이트하는 방법에 대한 튜토리얼입니다! Linux에서 컬 버전을 업데이트하는 방법에 대한 튜토리얼입니다! Mar 07, 2024 am 08:30 AM

Linux에서 컬 버전을 업데이트하려면 다음 단계를 따르세요. 현재 컬 버전을 확인하세요. 먼저 현재 시스템에 설치된 컬 버전을 확인해야 합니다. 터미널을 열고 다음 명령을 실행합니다. 컬 --version 이 명령은 현재 컬 버전 정보를 표시합니다. 사용 가능한 컬 버전 확인: 컬을 업데이트하기 전에 사용 가능한 최신 버전을 확인해야 합니다. 최신 버전의 컬을 찾으려면 컬의 공식 웹사이트(curl.haxx.se)나 관련 소프트웨어 소스를 방문하세요. 컬 소스 코드 다운로드: 컬 또는 브라우저를 사용하여 선택한 컬 버전의 소스 코드 파일(일반적으로 .tar.gz 또는 .tar.bz2)을 다운로드합니다.

PHP8.1 출시: 여러 요청을 동시에 처리하기 위한 컬(curl) 도입 PHP8.1 출시: 여러 요청을 동시에 처리하기 위한 컬(curl) 도입 Jul 08, 2023 pm 09:13 PM

PHP8.1 출시: 여러 요청의 동시 처리를 위한 컬 소개 최근 PHP는 여러 요청의 동시 처리를 위한 컬이라는 중요한 기능을 도입한 최신 버전의 PHP8.1을 공식 출시했습니다. 이 새로운 기능은 개발자에게 여러 HTTP 요청을 처리하는 보다 효율적이고 유연한 방법을 제공하여 성능과 사용자 경험을 크게 향상시킵니다. 이전 버전에서는 여러 요청을 처리하려면 여러 컬 리소스를 만들고 루프를 사용하여 각각 데이터를 보내고 받아야 하는 경우가 많았습니다. 이 방법으로 목적을 달성할 수는 있지만

처음부터 끝까지: PHP 확장 cURL을 사용하여 HTTP 요청을 만드는 방법 처음부터 끝까지: PHP 확장 cURL을 사용하여 HTTP 요청을 만드는 방법 Jul 29, 2023 pm 05:07 PM

처음부터 끝까지: HTTP 요청에 PHP 확장 cURL을 사용하는 방법 소개: 웹 개발에서는 종종 타사 API 또는 기타 원격 서버와 통신해야 합니다. cURL을 사용하여 HTTP 요청을 하는 것은 일반적이고 강력한 방법입니다. 이 기사에서는 PHP를 사용하여 cURL을 확장하여 HTTP 요청을 수행하는 방법을 소개하고 몇 가지 실용적인 코드 예제를 제공합니다. 1. 준비 먼저 php에 cURL 확장이 설치되어 있는지 확인하세요. 명령줄에서 php-m|grepcurl을 실행하여 확인할 수 있습니다.

PHP Curl에서 웹 페이지의 301 리디렉션을 처리하는 방법은 무엇입니까? PHP Curl에서 웹 페이지의 301 리디렉션을 처리하는 방법은 무엇입니까? Mar 08, 2024 am 11:36 AM

PHPCurl에서 웹 페이지의 301 리디렉션을 처리하는 방법은 무엇입니까? PHPCurl을 사용하여 네트워크 요청을 보낼 때 웹 페이지에서 반환된 301 상태 코드를 자주 접하게 되는데, 이는 페이지가 영구적으로 리디렉션되었음을 나타냅니다. 이 상황을 올바르게 처리하려면 Curl 요청에 몇 가지 특정 옵션과 처리 논리를 추가해야 합니다. 다음은 PHPCurl에서 웹페이지의 301 리디렉션을 처리하는 방법을 자세히 소개하고 구체적인 코드 예제를 제공합니다. 301 리디렉션 처리 원칙 301 리디렉션은 서버가 30을 반환한다는 의미입니다.

리눅스 컬이 뭐야? 리눅스 컬이 뭐야? Apr 20, 2023 pm 05:05 PM

Linux에서 컬은 서버와 데이터를 전송하는 매우 실용적인 도구입니다. 이는 명령줄에서 작동하는 URL 규칙을 사용하는 파일 전송 도구이며, 포괄적인 전송 도구입니다. Curl은 프록시 액세스, 사용자 인증, FTP 업로드 및 다운로드, HTTP POST, SSL 연결, 쿠키 지원, 중단점 재개 등 매우 유용한 기능을 많이 제공합니다.

PHP 컬에서 쿠키를 설정하는 방법 PHP 컬에서 쿠키를 설정하는 방법 Sep 26, 2021 am 09:27 AM

PHP 컬에서 쿠키를 설정하는 방법: 1. PHP 샘플 파일을 생성합니다. 2. "curl_setopt" 함수를 통해 cURL 전송 옵션을 설정합니다. 3. CURL에 쿠키를 전달합니다.

PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 함수 컬_setopt() 호출 PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 함수 컬_setopt() 호출 Jun 23, 2023 am 08:18 AM

PHP는 많은 웹사이트에서 널리 사용되는 오픈 소스 스크립팅 언어입니다. 그러나 때로는 웹사이트가 제대로 작동하지 못하게 할 수 있는 PHPFatalerror:Calltoundefoundfunctioncurl_setopt() 문제가 발생할 수 있습니다. 그렇다면 이 문제의 원인은 정확히 무엇입니까? PHP에서 컬_setopt()는 매우 중요한 함수로, 컬을 통해 라이브러리를 확장하는 데 사용됩니다.

See all articles