Rumah pembangunan bahagian belakang tutorial php curl上传文件版本差异问题解析

curl上传文件版本差异问题解析

Mar 05, 2018 am 10:22 AM
curl perbezaan Versi

=前端post表单上传文件后,在后端收到文件后转发post到图片服务器。于是使用了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);

   }
Salin selepas log masuk
Salin selepas log masuk

测试机的php版本是5.2这断代码没问题,但是放到线上,$_FILES变量死活收不到值。然后仔细观察,在$_POST里面收到了$_POST[‘video’]=’@/tmp/phps12d63’;这就比较奇怪了,第一反应是Content-Type没有正常传送,上传文件的Content-Type应该是’multipart/form-data’ ,这种情况应该是‘application/x-www-form-urlencoded’。然后在图片服务器上打印$_SERVER[‘HTTP_CONTENT_TYPE’]变量,发现就是‘multipart/form-data’。
查看手册,发现了如果是CURLOPT_POSTFIELDS的传递参数是数组,Content-Type头将会被设置成multipart/form-data。
然后还有一个神奇的CURLOPT_SAFE_UPLOAD参数,在php5.5.0中添加,默认值是false,5.6.0默认为ture,

CURLOPT_SAFE_UPLOAD
 TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用
 CURLFile 作为上传的代替。

而CURLOPT_POSTFIELDS参数说明

CURLOPT_POSTFIELDS
 全部数据使用HTTP协议中的 “POST” 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ‘;type=mimetype’ 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似’para1=val1¶2=val2&…’,也可以使用一个以字段名为键值,字段数据为值的数组。 如果value是一个数组,Content-Type头将会被设置成multipart/form-data。 从 PHP 5.2.0 开始,使用 @ 前缀传递文件时,value 必须是个数组。 从 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" : '');
    }
}
Salin selepas log masuk
Salin selepas log masuk

最后代码为

<?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);

   }
Salin selepas log masuk
Salin selepas log masuk

总结,遇到问题,要先冷静分析,然后在仔细阅读手册。

周五遇到一个问题,前端post表单上传文件后,在后端收到文件后转发post到图片服务器。于是使用了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);

   }
Salin selepas log masuk
Salin selepas log masuk

测试机的php版本是5.2这断代码没问题,但是放到线上,$_FILES变量死活收不到值。然后仔细观察,在$_POST里面收到了$_POST[‘video’]=’@/tmp/phps12d63’;这就比较奇怪了,第一反应是Content-Type没有正常传送,上传文件的Content-Type应该是’multipart/form-data’ ,这种情况应该是‘application/x-www-form-urlencoded’。然后在图片服务器上打印$_SERVER[‘HTTP_CONTENT_TYPE’]变量,发现就是‘multipart/form-data’。
查看手册,发现了如果是CURLOPT_POSTFIELDS的传递参数是数组,Content-Type头将会被设置成multipart/form-data。
然后还有一个神奇的CURLOPT_SAFE_UPLOAD参数,在php5.5.0中添加,默认值是false,5.6.0默认为ture,

CURLOPT_SAFE_UPLOAD
 TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用
 CURLFile 作为上传的代替。

而CURLOPT_POSTFIELDS参数说明

CURLOPT_POSTFIELDS
 全部数据使用HTTP协议中的 “POST” 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ‘;type=mimetype’ 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似’para1=val1¶2=val2&…’,也可以使用一个以字段名为键值,字段数据为值的数组。 如果value是一个数组,Content-Type头将会被设置成multipart/form-data。 从 PHP 5.2.0 开始,使用 @ 前缀传递文件时,value 必须是个数组。 从 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" : '');
    }
}
Salin selepas log masuk
Salin selepas log masuk

最后代码为

<?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);

   }
Salin selepas log masuk
Salin selepas log masuk

相关推荐:

php通过CURL上传文件

php curl上传文件的简单例子

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

Atas ialah kandungan terperinci curl上传文件版本差异问题解析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyemak versi numpy dengan cepat Bagaimana untuk menyemak versi numpy dengan cepat Jan 19, 2024 am 08:23 AM

Numpy ialah perpustakaan matematik penting dalam Python Ia menyediakan operasi tatasusunan yang cekap dan fungsi pengiraan saintifik dan digunakan secara meluas dalam analisis data, pembelajaran mesin, pembelajaran mendalam dan bidang lain. Apabila menggunakan numpy, kita selalunya perlu menyemak nombor versi numpy untuk menentukan fungsi yang disokong oleh persekitaran semasa. Artikel ini akan memperkenalkan cara menyemak versi numpy dengan cepat dan memberikan contoh kod khusus. Kaedah 1: Gunakan atribut __version__ yang disertakan dengan numpy Modul numpy disertakan dengan __.

Bagaimana untuk menyemak versi maven Bagaimana untuk menyemak versi maven Jan 17, 2024 pm 05:06 PM

Kaedah untuk menyemak versi maven: 1. Gunakan baris arahan 2. Semak pembolehubah persekitaran 3. Gunakan IDE 4. Semak fail pom.xml. Pengenalan terperinci: 1. Gunakan baris arahan, masukkan "mvn -v" atau "mvn --version" dalam baris arahan, dan kemudian tekan Enter Ini akan memaparkan maklumat versi Maven dan maklumat versi Java; variables , pada sesetengah sistem, anda boleh menyemak pembolehubah persekitaran untuk mencari maklumat versi Maven, masukkan arahan pada baris arahan, dan kemudian tekan Enter, dsb.

Tutorial mengemas kini versi curl di bawah Linux! Tutorial mengemas kini versi curl di bawah Linux! Mar 07, 2024 am 08:30 AM

Untuk mengemas kini versi curl di bawah Linux, anda boleh mengikuti langkah di bawah: Semak versi curl semasa: Pertama, anda perlu menentukan versi curl yang dipasang dalam sistem semasa. Buka terminal dan laksanakan arahan berikut: curl --version Perintah ini akan memaparkan maklumat versi curl semasa. Sahkan versi curl tersedia: Sebelum mengemas kini curl, anda perlu mengesahkan versi terkini yang tersedia. Anda boleh melawati tapak web rasmi curl (curl.haxx.se) atau sumber perisian yang berkaitan untuk mencari versi terkini curl. Muat turun kod sumber curl: Menggunakan curl atau penyemak imbas, muat turun fail kod sumber untuk versi curl pilihan anda (biasanya .tar.gz atau .tar.bz2

750,000 pusingan pertempuran satu lawan satu antara model besar, GPT-4 memenangi kejuaraan, dan Llama 3 menduduki tempat kelima 750,000 pusingan pertempuran satu lawan satu antara model besar, GPT-4 memenangi kejuaraan, dan Llama 3 menduduki tempat kelima Apr 23, 2024 pm 03:28 PM

Mengenai Llama3, keputusan ujian baharu telah dikeluarkan - komuniti penilaian model besar LMSYS mengeluarkan senarai kedudukan model besar Llama3 menduduki tempat kelima, dan terikat untuk tempat pertama dengan GPT-4 dalam kategori Bahasa Inggeris. Gambar ini berbeza daripada Penanda Aras yang lain Senarai ini berdasarkan pertempuran satu lawan satu antara model, dan penilai dari seluruh rangkaian membuat cadangan dan skor mereka sendiri. Pada akhirnya, Llama3 menduduki tempat kelima dalam senarai, diikuti oleh tiga versi GPT-4 dan Claude3 Super Cup Opus yang berbeza. Dalam senarai tunggal Inggeris, Llama3 mengatasi Claude dan terikat dengan GPT-4. Mengenai keputusan ini, ketua saintis Meta LeCun sangat gembira, tweet semula dan

Cara menyemak versi Oracle yang dipasang dengan mudah Cara menyemak versi Oracle yang dipasang dengan mudah Mar 07, 2024 am 11:27 AM

Cara menyemak versi Oracle yang dipasang dengan mudah memerlukan contoh kod khusus Sebagai perisian yang digunakan secara meluas dalam sistem pengurusan pangkalan data peringkat perusahaan, pangkalan data Oracle mempunyai banyak versi dan kaedah pemasangan yang berbeza. Dalam kerja harian kami, kami sering perlu menyemak versi pangkalan data Oracle yang dipasang untuk operasi dan penyelenggaraan yang sepadan. Artikel ini akan memperkenalkan cara menyemak versi Oracle yang dipasang dengan mudah dan memberikan contoh kod tertentu. Kaedah 1: Melalui pertanyaan SQL dalam pangkalan data Oracle, kita boleh

Semak versi sistem pengendalian Kirin dan versi kernel Semak versi sistem pengendalian Kirin dan versi kernel Feb 21, 2024 pm 07:04 PM

Menyemak versi sistem pengendalian Kylin dan versi kernel Dalam sistem pengendalian Kirin, mengetahui cara menyemak versi sistem dan versi kernel adalah asas untuk pengurusan dan penyelenggaraan sistem. Kaedah 1 untuk menyemak versi sistem pengendalian Kylin: Gunakan fail /etc/.kyinfo Untuk menyemak versi sistem pengendalian Kylin, anda boleh menyemak fail /etc/.kyinfo. Fail ini mengandungi maklumat versi sistem pengendalian. Jalankan arahan berikut: cat/etc/.kyinfo Perintah ini akan memaparkan maklumat versi terperinci sistem pengendalian. Kaedah 2: Gunakan fail /etc/issue Cara lain untuk menyemak versi sistem pengendalian adalah dengan melihat fail /etc/issue. Fail ini juga menyediakan maklumat versi, tetapi mungkin tidak sebaik fail .kyinfo

Langkah mudah untuk mengemas kini versi pip: selesai dalam 1 minit Langkah mudah untuk mengemas kini versi pip: selesai dalam 1 minit Jan 27, 2024 am 09:45 AM

Selesai dalam satu minit: Cara mengemas kini versi pip, contoh kod khusus diperlukan Dengan perkembangan pesat Python, pip telah menjadi alat standard untuk pengurusan pakej Python. Walau bagaimanapun, seiring dengan berlalunya masa, versi pip sentiasa dikemas kini Untuk dapat menggunakan ciri terkini dan memperbaiki kemungkinan kelemahan keselamatan, adalah sangat penting untuk mengemas kini versi pip. Artikel ini akan menerangkan cara mengemas kini pip dengan cepat dalam satu minit dan memberikan contoh kod khusus. Pertama, kita perlu membuka tetingkap baris arahan. Dalam sistem Windows, anda boleh menggunakan

Bagaimana untuk mengetahui sama ada antara muka dp ialah 1.2 atau 1.4? Bagaimana untuk mengetahui sama ada antara muka dp ialah 1.2 atau 1.4? Feb 06, 2024 am 10:27 AM

Antara muka DP adalah kabel antara muka yang penting dalam komputer Apabila menggunakan komputer, ramai pengguna ingin mengetahui sama ada antara muka DP adalah 1.2 atau 1.4, mereka hanya perlu menyemaknya dalam GPU-Z. Cara menentukan sama ada antara muka dp ialah 1.2 atau 1.4: 1. Mula-mula, pilih "Lanjutan" dalam GPU-Z. 2. Lihat "Monitor1" dalam "General" di bawah "Advanced", anda boleh melihat dua item "LinkRate (semasa)" dan "Lanes (semasa)". 3. Akhir sekali, jika 8.1Gbps×4 dipaparkan, ia bermakna versi DP1.3 atau lebih tinggi, biasanya DP1.4 Jika 5.4Gbps×4, maka

See all articles