และแล้วก็มาถึงจุดที่รอคอย การส่งไฟล์ด้วย curl เหมือนที่ user upload ไฟล์เข้าเว็บ เหมาะกับการเอาไปเขียนโปรแกรมทรานสเฟอร์ไฟล์จากเว็บหนึ่งไปอีกที่หนึ่ง หรือจะเขียน bot ส่งไฟล์ออกไปเก็บเป็นข้อมูลสำรองก็ได้
<!doctype html> <html> <head> <meta charset="utf-8"> <title>CURL: send file</title> <link href="../vendor/twbs/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" type="text/css"> </head> <body> <div class="container"> <?php if (count($_FILES) || count($_POST)) { $url = 'http://localhost/snippets/PHP/variables.php'; if (count($_FILES)) { $file_name_with_full_path = $_FILES['avatar']['tmp_name']; if (function_exists('curl_file_create')) { /* php 5.5+ */ $_POST['avatar'] = curl_file_create($file_name_with_full_path); } else { $_POST['avatar'] = '@' . realpath($file_name_with_full_path); } } $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_ENCODING => 'UTF-8', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $_POST, //CURLOPT_POSTFIELDS => http_build_query($_POST), CURLOPT_RETURNTRANSFER => true, CURLOPT_URL => $url, ]); $result = curl_exec($ch); curl_close($ch); echo $result; } ?> <form action="curl_file.php" enctype="multipart/form-data" method="post"> <div class="form-group"> <label for="name">Name:</label> <input class="form-control" id="name" name="name" type="text"> </div> <div class="form-group"> <label for="avatar">Avatar:</label> <input accept="image/gif, image/jpeg, image/x-png" class="form-control" id="avatar" name="avatar" type="file"> </div> <div class="form-group"> <label for="address1">text address:</label> <input class="form-control" id="address1" name="address[d]" type="text"> </div> <div class="form-group"> <label for="address2">text address 2:</label> <input class="form-control" id="address2" name="address[f]" type="text"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> </div> </body> </html>
แต่เพราะ bug ของ function http_build_query ไม่สามารถ encoded query string ในกรณีที่มีไฟล์ได้อย่างถูกต้อง ทำให้ต้องส่งค่าฟอร์มไปโดยไม่เข้ารหัส ดังนั้น ค่าที่เป็น array จึงส่งค่าออกไปผิด
[address]Array ( [name] => pitt phunsanit [address] => Array )
จากที่ค้นหาข้อมูลดู ยังไม่มีวิธีที่แก้ปัญหานี้ได้โดยไม่มีผลอาการข้างเคียง คงต้องรอให้ทางทีมงานพัฒนา PHP แก้ปัญหาให้ ตอนนี้ก็พยามหลีกเลี่ยงการส่งข้อมูลแบบเป็นอาร์เรไปก่อน อาจจะใช้ implode รวมข้อมูลก่อนส่งไปก็ได้
About the author