และแล้วก็มาถึงจุดที่รอคอย การส่งไฟล์ด้วย curl เหมือนที่ user upload ไฟล์เข้าเว็บ เหมาะกับการเอาไปเขียนโปรแกรมทรานสเฟอร์ไฟล์จากเว็บหนึ่งไปอีกที่หนึ่ง หรือจะเขียน bot ส่งไฟล์ออกไปเก็บเป็นข้อมูลสำรองก็ได้
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <!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 )) { 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 จึงส่งค่าออกไปผิด
1 2 3 4 5 | [address]Array ( [name] => pitt phunsanit [address] => Array ) |
จากที่ค้นหาข้อมูลดู ยังไม่มีวิธีที่แก้ปัญหานี้ได้โดยไม่มีผลอาการข้างเคียง คงต้องรอให้ทางทีมงานพัฒนา PHP แก้ปัญหาให้ ตอนนี้ก็พยามหลีกเลี่ยงการส่งข้อมูลแบบเป็นอาร์เรไปก่อน อาจจะใช้ implode รวมข้อมูลก่อนส่งไปก็ได้