백엔드 개발 PHP 튜토리얼 컬 업로드 파일 버전 차이 문제 분석

컬 업로드 파일 버전 차이 문제 분석

Mar 05, 2018 am 10:22 AM
curl 차이점 버전

=프론트엔드 게시물 양식이 파일을 업로드한 후 백엔드는 파일을 수신한 후 게시물을 이미지 서버로 전달합니다. 그래서 컬을 이용해서 업로드를 했고, '@파일경로'를 이용해서 업로드했습니다

코드는 다음과 같습니다

<?php
    if($_FILES[&#39;video&#39;][&#39;size&#39;]>0){        $data = array('video'=>$_FILES['video']['tmp_name']);         $ch = curl_init();         $url="test.php";
        // 设置URL和相应的选项
        curl_setopt($ch, CURLOPT_URL, $url);
        //启用时会将头文件的信息作为数据流输出。 
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //将curl_exec()获取的信息以字符串返回,而不是直接输出
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);         $res = curl_exec($ch);
        // 抓取URL并把它传递给浏览器
        curl_exec($ch);
        // 关闭cURL资源,并且释放系统资源
        curl_close($ch);

   }
로그인 후 복사
로그인 후 복사

테스트기의 PHP 버전은 5.2 인데, 코드가 깨지는 데는 문제가 없지만, 온라인에 올리면 됩니다. , $_FILES 변수는 값을 받을 수 없습니다. 그러면 $_POST['video']='@/tmp/phps12d63'; 을 받았습니다. 첫 번째 반응은 Content-Type이 정상적으로 전송되지 않는다는 것입니다. 업로드된 파일은 'multipart/form-data'여야 하며, 이 경우 'application/x-www-form-urlencoded'여야 합니다. 그런 다음 이미지 서버에서 $_SERVER['HTTP_CONTENT_TYPE'] 변수를 인쇄하고 'multipart/form-data'인지 확인합니다.
매뉴얼을 확인하여 CURLOPT_POSTFIELDS의 전달된 매개변수가 배열인 경우 Content-Type 헤더가 multipart/form-data로 설정된다는 것을 확인했습니다.
그런 다음 php5.5.0에 추가된 마법의 CURLOPT_SAFE_UPLOAD 매개변수가 있습니다. 기본값은 false이고 5.6.0의 기본값은 true입니다.

CURLOPT_SAFE_UPLOAD
TRUE는 CURLOPT_POSTFIELDS에 @ 접두사가 있는 파일 전송을 비활성화합니다. 이는 @를 필드에서 안전하게 사용할 수 있음을 의미합니다. 가능
업로드를 대체하는 CURLFile입니다.

그리고 CURLOPT_POSTFIELDS 매개변수 설명

CURLOPT_POSTFIELDS
모든 데이터는 HTTP 프로토콜의 "POST" 작업을 사용하여 전송됩니다. 파일을 보내려면 파일 이름 앞에 @를 붙이고 전체 경로를 사용하세요. 파일 형식은 파일 이름 뒤에 ';type=mimetype' 형식으로 지정할 수 있습니다. 이 매개변수는 'para1=val1¶2=val2&...'와 유사한 urlencoded 문자열일 수도 있고 필드 이름을 키로, 필드 데이터를 값으로 사용하는 배열을 사용할 수도 있습니다. 값이 배열이면 Content-Type 헤더가 multipart/form-data로 설정됩니다. PHP 5.2.0부터 @ 접두사를 사용하여 파일을 전달할 때 값은 배열이어야 합니다. PHP 5.5.0부터 @ 접두사는 더 이상 사용되지 않으며 CURLFile을 통해 파일을 보낼 수 있습니다. 보안 강화를 위해 @ 접두사가 포함된 파일 전송을 비활성화하려면 CURLOPT_SAFE_UPLOAD를 TRUE로 설정합니다.

버전을 확인해 보니 테스트 환경은 php5.3, 온라인 테스트 환경은 5.6인데, 이는 CURLOPT_SAFE_UPLOAD가 기본값이 true이고 @업로드가 비활성화되어 있으며 @는 일반 문자열이라는 뜻입니다. 5.5부터 파일 업로드 시 @ 접두사가 삭제되었습니다. 5.5보다 큰 버전은 CURLFile을 사용하여 업로드해야 합니다. 최종 호환 솔루션은 5.5보다 작은 경우 @ 접두사를 사용하고 5.5보다 큰 경우 CURLFile을 사용합니다. 5.5 미만의 버전에서는 @를 사용하여 업로드하고 추가 매개변수를 추가할 수 있습니다. filename = file name = mime type;

<?php
//curl_file_create是函数的别名CURLFile::__construct() if (!function_exists('curl_file_create')) {
    function curl_file_create($filename, $mimetype = '', $postname = '') {
        return "@$filename;filename="
            . ($postname ?: basename($filename))
            . ($mimetype ? ";type=$mimetype" : '');
    }
}
로그인 후 복사
로그인 후 복사

마지막 코드는

<?php
    if($_FILES[&#39;video&#39;][&#39;size&#39;]>0){        $data = array('video'=>$_FILES['video']['tmp_name']);         $ch = curl_init();         $url="test.php";
        // 设置URL和相应的选项
        curl_setopt($ch, CURLOPT_URL, $url);
        //启用时会将头文件的信息作为数据流输出。 
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //将curl_exec()获取的信息以字符串返回,而不是直接输出
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);        $data['video']=curl_file_create($_FILES['video']['tmp_name'],'video/mp4',$_FILES['video']['name']);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);         $res = curl_exec($ch);
        // 抓取URL并把它传递给浏览器
        curl_exec($ch);
        // 关闭cURL资源,并且释放系统资源
        curl_close($ch);

   }
로그인 후 복사
로그인 후 복사

입니다. 요약하자면, 문제가 발생하면 먼저 침착하게 분석한 후 매뉴얼을 주의 깊게 읽어보세요.

금요일에 프런트 엔드 게시물 양식이 파일을 업로드한 후 백엔드에서 파일을 받은 후 게시물을 이미지 서버로 전달하는 데 문제가 발생했습니다. 그래서 컬을 이용해서 업로드를 했고, '@file path'를 이용해 업로드를 했습니다
코드는 다음과 같습니다

<?php
    if($_FILES[&#39;video&#39;][&#39;size&#39;]>0){        $data = array('video'=>$_FILES['video']['tmp_name']);         $ch = curl_init();         $url="test.php";
        // 设置URL和相应的选项
        curl_setopt($ch, CURLOPT_URL, $url);
        //启用时会将头文件的信息作为数据流输出。 
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //将curl_exec()获取的信息以字符串返回,而不是直接输出
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);         $res = curl_exec($ch);
        // 抓取URL并把它传递给浏览器
        curl_exec($ch);
        // 关闭cURL资源,并且释放系统资源
        curl_close($ch);

   }
로그인 후 복사
로그인 후 복사

테스트 머신의 PHP 버전은 5.2 인데, 코드가 깨지는 데에는 문제가 없지만, 온라인에 올려놓으면 $_FILES 변수는 값을 받을 수 없습니다. 그런 다음 $_POST['video']='@/tmp/phps12d63'; 을 받았습니다. 첫 번째 반응은 Content-Type이 정상적으로 전송되지 않는다는 것입니다. 업로드된 파일은 'multipart/form-data'여야 하며, 이 경우 'application/x-www-form-urlencoded'여야 합니다. 그런 다음 이미지 서버에서 $_SERVER['HTTP_CONTENT_TYPE'] 변수를 인쇄하고 'multipart/form-data'인지 확인합니다.
매뉴얼을 확인하여 CURLOPT_POSTFIELDS의 전달된 매개변수가 배열인 경우 Content-Type 헤더가 multipart/form-data로 설정된다는 것을 확인했습니다.
그런 다음 php5.5.0에 추가된 마법의 CURLOPT_SAFE_UPLOAD 매개변수가 있습니다. 기본값은 false이고 5.6.0의 기본값은 true입니다.

CURLOPT_SAFE_UPLOAD
TRUE는 CURLOPT_POSTFIELDS에 @ 접두사가 있는 파일 전송을 비활성화합니다. 이는 @를 필드에서 안전하게 사용할 수 있음을 의미합니다. 가능
업로드를 대체하는 CURLFile입니다.

그리고 CURLOPT_POSTFIELDS 매개변수 설명

CURLOPT_POSTFIELDS
모든 데이터는 HTTP 프로토콜의 "POST" 작업을 사용하여 전송됩니다. 파일을 보내려면 파일 이름 앞에 @를 붙이고 전체 경로를 사용하세요. 파일 형식은 파일 이름 뒤에 ';type=mimetype' 형식으로 지정할 수 있습니다. 이 매개변수는 'para1=val1¶2=val2&...'와 유사한 urlencoded 문자열일 수도 있고 필드 이름을 키로, 필드 데이터를 값으로 사용하는 배열을 사용할 수도 있습니다. 값이 배열이면 Content-Type 헤더가 multipart/form-data로 설정됩니다. PHP 5.2.0부터 @ 접두사를 사용하여 파일을 전달할 때 값은 배열이어야 합니다. PHP 5.5.0부터 @ 접두사는 더 이상 사용되지 않으며 CURLFile을 통해 파일을 보낼 수 있습니다. 보안 강화를 위해 @ 접두사가 포함된 파일 전송을 비활성화하려면 CURLOPT_SAFE_UPLOAD를 TRUE로 설정합니다.

查看版本,果然测试环境是php5.3,而线上测试环境是5.6,也是就是说CURLOPT_SAFE_UPLOAD默认为true,禁用了@ 上传,@就是普通字符串了。而从5.5开始@前缀上传文件已经被废弃。大于5.5版本需使用CURLFile 上传。最后兼容方案小于5.5使用@前缀,大于5.5使用CURLFile,在小于5.5的版本是用@上传还可以添加额外的参数;filename=文件名;type=mime类型

<?php
//curl_file_create是函数的别名CURLFile::__construct() if (!function_exists('curl_file_create')) {
    function curl_file_create($filename, $mimetype = '', $postname = '') {
        return "@$filename;filename="
            . ($postname ?: basename($filename))
            . ($mimetype ? ";type=$mimetype" : '');
    }
}
로그인 후 복사
로그인 후 복사

最后代码为

<?php
    if($_FILES[&#39;video&#39;][&#39;size&#39;]>0){        $data = array('video'=>$_FILES['video']['tmp_name']);         $ch = curl_init();         $url="test.php";
        // 设置URL和相应的选项
        curl_setopt($ch, CURLOPT_URL, $url);
        //启用时会将头文件的信息作为数据流输出。 
        curl_setopt($ch, CURLOPT_HEADER, 0);
        //将curl_exec()获取的信息以字符串返回,而不是直接输出
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);        $data['video']=curl_file_create($_FILES['video']['tmp_name'],'video/mp4',$_FILES['video']['name']);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);         $res = curl_exec($ch);
        // 抓取URL并把它传递给浏览器
        curl_exec($ch);
        // 关闭cURL资源,并且释放系统资源
        curl_close($ch);

   }
로그인 후 복사
로그인 후 복사

相关推荐:

php通过CURL上传文件

php curl上传文件的简单例子

post - php curl上传文件如何像表单一样指定其name值

위 내용은 컬 업로드 파일 버전 차이 문제 분석의 상세 내용입니다. 자세한 내용은 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 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

numpy 버전을 빠르게 확인하는 방법 numpy 버전을 빠르게 확인하는 방법 Jan 19, 2024 am 08:23 AM

Numpy는 Python의 중요한 수학 라이브러리로 효율적인 배열 연산과 과학적인 계산 기능을 제공하며 데이터 분석, 기계 학습, 딥 러닝 및 기타 분야에서 널리 사용됩니다. numpy를 사용할 때, 현재 환경에서 지원하는 기능을 확인하기 위해 numpy의 버전 번호를 확인해야 하는 경우가 많습니다. 이 기사에서는 numpy 버전을 빠르게 확인하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 방법 1: numpy와 함께 제공되는 __version__ 속성을 사용하세요. numpy 모듈은 __과 함께 제공됩니다.

메이븐 버전 확인하는 방법 메이븐 버전 확인하는 방법 Jan 17, 2024 pm 05:06 PM

Maven 버전을 확인하는 방법: 1. 명령줄을 사용합니다. 2. 환경 변수를 확인합니다. 3. IDE를 사용합니다. 4. pom.xml 파일을 확인합니다. 자세한 소개: 1. 명령줄을 사용하여 명령줄에 "mvn -v" 또는 "mvn --version"을 입력한 다음 Enter를 누르면 Maven 버전 정보와 Java 버전 정보가 표시됩니다. 변수, 일부 시스템에서는 환경 변수를 확인하여 Maven 버전 정보를 찾고, 명령줄에 명령을 입력한 다음 Enter 키를 누르는 등의 작업을 수행할 수 있습니다.

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

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

대형모델간 75만 라운드 1대1 대결, GPT-4가 우승, 라마3가 5위 대형모델간 75만 라운드 1대1 대결, GPT-4가 우승, 라마3가 5위 Apr 23, 2024 pm 03:28 PM

Llama3에 대해 새로운 테스트 결과가 공개되었습니다. 대형 모델 평가 커뮤니티 LMSYS가 공개한 대형 모델 순위 목록에서 Llama3는 5위에 올랐으며, 영어 부문에서는 GPT-4와 함께 공동 1위를 차지했습니다. 다른 벤치마크와는 그림이 다릅니다. 이 목록은 모델 간 1:1 대결을 기반으로 하며, 네트워크 전체의 평가자들이 각자의 제안과 점수를 내립니다. 결국 Llama3가 5위를 차지했고, GPT-4와 Claude3 Super Cup Opus의 세 가지 버전이 그 뒤를 이었습니다. 영어 싱글 목록에서는 Llama3가 Claude를 제치고 GPT-4와 동점을 기록했습니다. 이 결과에 대해 Meta의 수석 과학자 LeCun은 매우 기뻐했으며 트윗을 통해 다음과 같이 말했습니다.

설치된 Oracle 버전을 쉽게 확인하는 방법 설치된 Oracle 버전을 쉽게 확인하는 방법 Mar 07, 2024 am 11:27 AM

설치된 Oracle 버전을 쉽게 확인하려면 특정 코드 예제가 필요합니다. 기업 수준의 데이터베이스 관리 시스템에서 널리 사용되는 소프트웨어로 Oracle 데이터베이스에는 다양한 버전과 설치 방법이 있습니다. 일상 업무에서 우리는 해당 운영 및 유지 관리를 위해 설치된 Oracle 데이터베이스 버전을 확인해야 하는 경우가 많습니다. 이번 글에서는 설치된 오라클 버전을 쉽게 확인하는 방법과 구체적인 코드 예시를 소개하겠습니다. 방법 1: Oracle 데이터베이스의 SQL 쿼리를 통해 다음을 수행할 수 있습니다.

Kirin 운영 체제 버전과 커널 버전을 확인하세요. Kirin 운영 체제 버전과 커널 버전을 확인하세요. Feb 21, 2024 pm 07:04 PM

Kylin 운영 체제 버전 및 커널 버전 확인 Kirin 운영 체제에서 시스템 버전 및 커널 버전을 확인하는 방법을 아는 것은 시스템 관리 및 유지 관리의 기초입니다. Kylin 운영 체제 버전을 확인하는 방법 1: /etc/.kyinfo 파일을 사용하여 Kylin 운영 체제 버전을 확인하려면 /etc/.kyinfo 파일을 확인하세요. 이 파일에는 운영 체제 버전 정보가 포함되어 있습니다. 다음 명령을 실행합니다: cat/etc/.kyinfo 이 명령은 운영 체제의 자세한 버전 정보를 표시합니다. 방법 2: /etc/issue 파일 사용 운영 체제 버전을 확인하는 또 다른 방법은 /etc/issue 파일을 보는 것입니다. 이 파일은 버전 정보도 제공하지만 .kyinfo 파일만큼 좋지 않을 수 있습니다.

pip 버전을 업데이트하는 간단한 단계: 1분 안에 완료 pip 버전을 업데이트하는 간단한 단계: 1분 안에 완료 Jan 27, 2024 am 09:45 AM

1분 안에 완료: pip 버전을 업데이트하려면 특정 코드 예제가 필요합니다. Python의 급속한 발전으로 pip는 Python 패키지 관리를 위한 표준 도구가 되었습니다. 그러나 시간이 지남에 따라 pip 버전은 지속적으로 업데이트됩니다. 최신 기능을 사용하고 가능한 보안 취약점을 수정하려면 pip 버전을 업데이트하는 것이 매우 중요합니다. 이 글에서는 1분 안에 pip를 빠르게 업데이트하는 방법을 소개하고 구체적인 코드 예시를 제공합니다. 먼저 명령줄 창을 열어야 합니다. Windows 시스템에서는 다음을 사용할 수 있습니다.

dp 인터페이스가 1.2인지 1.4인지 어떻게 알 수 있나요? dp 인터페이스가 1.2인지 1.4인지 어떻게 알 수 있나요? Feb 06, 2024 am 10:27 AM

DP 인터페이스는 컴퓨터를 사용할 때 DP 인터페이스가 1.2인지 1.4인지 확인하는 방법을 알고 싶어하는 중요한 인터페이스 케이블입니다. 실제로 GPU-Z에서만 확인하면 됩니다. dp 인터페이스가 1.2인지 1.4인지 확인하는 방법: 1. 먼저 GPU-Z에서 "Advanced(고급)"를 선택합니다. 2. "Advanced" 아래의 "General"에서 "Monitor1"을 보면 "LinkRate(현재)"와 "Lanes(현재)" 두 항목을 볼 수 있습니다. 3. 마지막으로 8.1Gbps×4가 표시되면 DP1.3 버전 이상을 의미하며, 일반적으로 5.4Gbps×4인 경우 DP1.4를 의미합니다.

See all articles