สามารถอัปโหลดหลายไฟล์ได้โดยใช้ไฟล์ที่แตกต่างกัน ชื่อสำหรับ ป้อนข้อมูล.
นอกจากนี้ยังสามารถอัปโหลดหลายไฟล์พร้อมกันและจัดเรียงข้อมูลโดยอัตโนมัติเป็นอาร์เรย์ให้กับคุณได้ ในการทำเช่นนั้น คุณต้องใช้ไวยากรณ์การส่งอาร์เรย์เดียวกันในรูปแบบ HTML เช่นเดียวกับที่คุณใช้กับการเลือกและช่องทำเครื่องหมายหลายรายการ:
คำเตือน
ตั้งแต่ PHP 5.2.12 การตั้งค่าการกำหนดค่า max_file_uploads ทำหน้าที่เป็นการจำกัดจำนวนไฟล์ที่สามารถอัปโหลดได้ในคำขอเดียว คุณจะต้องตรวจสอบให้แน่ใจว่าแบบฟอร์มของคุณไม่ได้พยายามอัปโหลดไฟล์ในคำขอเดียวเกินกว่าขีดจำกัดนี้
14 ปีที่แล้ว
เมื่ออัปโหลดหลายไฟล์ ตัวแปร $_FILES จะถูกสร้างขึ้นในรูปแบบ:
อาร์เรย์
=>อาร์เรย์
=> foo.txt
=> bar.txt
)
=>อาร์เรย์
=> ข้อความ/ธรรมดา
=> ข้อความ/ธรรมดา
)
=>อาร์เรย์
=> /tmp/phpYzdqkD
=> /tmp/phpeEwEWG
)
=>อาร์เรย์
=> 0
=> 0
)
=>อาร์เรย์
=> 123
=> 456
)
ฉันพบว่ามันสร้างมาเพื่อโค้ดที่สะอาดกว่าเล็กน้อยหากฉันมีอาร์เรย์ไฟล์ที่อัปโหลดอยู่ในแบบฟอร์ม
อาร์เรย์
=>อาร์เรย์
=> foo.txt
=> ข้อความ/ธรรมดา
=> /tmp/phpYzdqkD
=> 0
=> 123
)
=>อาร์เรย์
=> bar.txt
=> ข้อความ/ธรรมดา
=> /tmp/phpeEwEWG
=> 0
=> 456
)
ฉันเขียนฟังก์ชันด่วนที่จะแปลงอาร์เรย์ $_FILES เป็นอาร์เรย์ที่สะอาดกว่า (IMHO)
ฟังก์ชั่น reArrayFiles (& $file_post ) (
$file_ary = อาร์เรย์();
$file_count = count($file_post["ชื่อ"]);
$file_keys = array_keys($file_post);
สำหรับ ($i = 0; $i<
$file_count
;
$i
++) {
foreach ($file_keys เป็น $key) (
$file_ary [ $i ][ $key ] = $file_post [ $key ][ $i ];
}
}
กลับ $file_ary ;
}
?>
ตอนนี้ฉันสามารถทำสิ่งต่อไปนี้ได้:
ถ้า($_FILES["อัปโหลด"]) (
$file_ary = reArrayFiles($_FILES["ufile"]);
foreach ($file_ary เป็น $file) (
พิมพ์ "ชื่อไฟล์:" . $ไฟล์["ชื่อ"];
พิมพ์ "ประเภทไฟล์:" . $ไฟล์["ประเภท"];
พิมพ์ "ขนาดไฟล์:" . $ไฟล์["ขนาด"];
}
}
?>
5 ปีที่แล้ว
สิ่งนี้ยังจำเป็นสำหรับ องค์ประกอบ
ดังนั้น หากคุณมีองค์ประกอบอินพุตดังนี้:
ควรเขียนแบบนี้ว่า
ไม่เช่นนั้นคุณจะสามารถรับได้เพียงไฟล์เดียวเท่านั้น
9 ปีที่แล้ว
นี่คือฟังก์ชันในการแก้ไขตัวบ่งชี้หลายมิติเพื่อให้แยกวิเคราะห์ได้ง่ายขึ้นเมื่อจัดการกับการอัปโหลดไฟล์ ใช้อาร์เรย์ฟิลด์ $_FILES เดี่ยวเป็นพารามิเตอร์ และแยกไฟล์ที่อัปโหลดแต่ละไฟล์ด้วยคีย์ตัวเลข สิ่งนี้ทำให้สามารถวนซ้ำได้เช่น:
fixFilesArray($_FILES["array_of_files"]);
foreach ($_FILES [ "array_of_files" ] เป็น $position => $file ) (
// ควรส่งออกอาร์เรย์พร้อมชื่อดัชนี ประเภท tmp_name ข้อผิดพลาด ขนาด
var_dump($ไฟล์);
}
?>
นี่คือรหัส:
/**
* แก้ไขการจัดทำดัชนีคี่ของการอัพโหลดไฟล์หลายไฟล์จากรูปแบบ:
*
* $_FILES["field"]["key"]["index"]
*
* ให้เป็นมาตรฐานและเหมาะสมยิ่งขึ้น:
*
* $_FILES["field"]["index"]["key"]
*
* @param อาร์เรย์ $files
* @ผู้เขียน Corey Ballou
* @ลิงค์ http://www.jqueryin.com
*/
ฟังก์ชั่น fixFilesArray (& $files )
{
$names = array("name" => 1 , "type" => 1 , "tmp_name" => 1 , "error" => 1 , "size" => 1 );
Foreach ($ไฟล์เป็น $key => $part ) (
// จัดการกับคีย์ที่ถูกต้องและหลายไฟล์เท่านั้น
$คีย์ = (สตริง) $คีย์ ;
ถ้า (isset($names [ $key ]) && is_array ($part )) (
foreach ($ส่วนหนึ่งเป็น $position => $value ) (
$files [ $position ][ $key ] = $value ;
}
// ลบการอ้างอิงคีย์เก่า
unset($ไฟล์ [ $key ]);
}
}
}
?>
3 ปีที่แล้ว
นี่เป็นตัวอย่างง่ายๆ:
เสียงสะท้อน "
" ;
$img = $_FILES["img"];ถ้า(!ว่างเปล่า($img ))
{
$img_desc = reArrayFiles($img);
print_r($img_desc);foreach($img_desc เป็น $val )
{
$newname = date("YmdHis" , time()). mt_rand() ".jpg" ;
move_uploaded_file ($val [ "tmp_name" ], "./uploads/" . $newname );
}
}ฟังก์ชัน reArrayFiles ($ไฟล์)
{
$file_ary = อาร์เรย์();
$file_count = count($file["ชื่อ"]);
$file_key = array_keys($ไฟล์);สำหรับ($i = 0 ; $i< $file_count ; $i ++)
{
foreach($file_key เป็น $val)
{
$file_ary [ $i ][ $val ] = $file [ $val ][ $i ];
}
}
กลับ $file_ary ;
}2 ปีที่แล้ว
ครั้งหนึ่งผมต้องทำการบำรุงรักษาใน ERP ขนาดใหญ่ที่มีอินพุตการอัพโหลดหลายตัวภายในอาเรย์ เพียงเท่านี้:
อาร์เรย์ $_FILES ถูกสร้างขึ้นดังนี้:
อาร์เรย์
=>อาร์เรย์
=>อาร์เรย์
=> teste.c
=> อัณฑะ
)
=>อาร์เรย์
=> ข้อความ/x-csrc
=> application/octet-stream
)
=>อาร์เรย์
=> /opt/lampp/temp/phpuf3KNj
=> /opt/lampp/temp/php0yPZap
)
=>อาร์เรย์
=> 0
=> 0
)
=>อาร์เรย์
=> 1960
=> 8661
)
=>อาร์เรย์
=>อาร์เรย์
=> jefrey.html
=> notas.txt
)
=>อาร์เรย์
=> ข้อความ/html
=> ข้อความ/ธรรมดา
)
=>อาร์เรย์
=> /opt/lampp/temp/php87nfyu
=> /opt/lampp/temp/phpUBlvVz
)
=>อาร์เรย์
=> 0
=> 0
)
=>อาร์เรย์
=> 583
=> 191
)
ฉันจัดการจัดเรียงอาร์เรย์นี้ใหม่ได้ดังนี้:
อาร์เรย์
=>อาร์เรย์
=>อาร์เรย์
=> teste.c
=> ข้อความ/x-csrc
=> /opt/lampp/temp/phpuf3KNj
=> 0
=> 1960
)
=>อาร์เรย์
=> อัณฑะ
=> application/octet-stream
=> /opt/lampp/temp/php0yPZap
=> 0
=> 8661
)
=>อาร์เรย์
=>อาร์เรย์
=> jefrey.html
=> ข้อความ/html
=> /opt/lampp/temp/php87nfyu
=> 0
=> 583
)
=>อาร์เรย์
=> notas.txt
=> ข้อความ/ธรรมดา
=> /opt/lampp/temp/phpUBlvVz
=> 0
=> 191
)
นี่คือตัวอย่างของฉัน:
ฟังก์ชั่น reArrayFilesMultiple (& $files ) (
$อัพโหลด = array();
foreach($_FILES เป็น $key0 => $FILES ) (
foreach($FILES เป็น $key => $value ) (
foreach($value เป็น $key2 => $value2 ) (
$อัพโหลด [ $key0 ][ $key2 ][ $key ] = $value2 ;
}
}
}
$files = $อัพโหลด ;
ส่งคืน $ อัพโหลด; // ป้องกันปัญหาการใช้งานในทางที่ผิด
}
?>
3 ปีที่แล้ว
นี่เป็นเพียงการแก้ไขโค้ดซึ่งเป็นข้อความยอดนิยมของ "phpuser" ที่นี่ เวอร์ชันของเขา/เธอต้องการให้อาร์เรย์ $file_post ที่ส่งผ่านไปยังฟังก์ชันถูกสร้างขึ้นโดยแบบฟอร์มที่ส่งมาพร้อมกับชุดแอตทริบิวต์หลายชุด หากมีหลายชุดในแท็กอินพุต html $_FILES["fileInputName"]["name"] จะเป็นอาร์เรย์ไม่ว่าจะส่งเพียงไฟล์เดียวหรือหลายไฟล์ก็ตาม แต่เมื่อไร ถูกใช้โดยไม่มีแอตทริบิวต์หลายตัว ดังนั้น $_FILES["fileInputName"]["name"] ไม่ใช่อาร์เรย์ แต่มีสตริงที่มีชื่อไฟล์ หากต้องการใช้ฟังก์ชันเรียบร้อยนี้โดยมีหรือไม่มีหลายชุด และเพื่อคืนค่าอาร์เรย์ซึ่งคุณสามารถ "ค้นหา" ได้ไม่ว่าในกรณีใด ให้ใช้การแก้ไขนี้:
ฟังก์ชั่น reArrayFiles(&$file_post)
{
$file_ary = อาร์เรย์();
$multiple = is_array($file_post["ชื่อ"]);
$file_count = $หลาย ? นับ($file_post["ชื่อ"]) : 1;
$file_keys = array_keys($file_post);
สำหรับ ($i=0; $i<$file_count; $i++)
{
foreach ($file_keys เป็น $key)
{
$file_ary[$i][$key] = $multiple ? $file_post[$key][$i] : $file_post[$key];
}
}
ส่งกลับ $file_ary;
}
3 ปีที่แล้ว
โซลูชันแบบเรียกซ้ำสำหรับสถานการณ์ที่ซับซ้อน (รองรับอาร์เรย์ที่ซ้อนกัน รวมถึงอาร์เรย์ที่จัดทำดัชนี)
ฟังก์ชั่น getFixedFilesArray() (
$walker = function ($arr, $fileInfokey, $walker ที่เรียกได้) (
$ret = array();
foreach ($arr เป็น $k => $v) (
ถ้า (is_array($v)) (
$ret[$k] = $วอล์คเกอร์($v, $fileInfokey, $วอล์คเกอร์);
) อื่น (
$ret[$k][$fileInfokey] = $v;
}
}
ส่งคืน $ret;
};
$files = อาร์เรย์();
foreach ($_FILES เป็น $name => $values) (
// เริ่มต้นสำหรับ array_merge
ถ้า (!isset($files[$name])) (
$files[$name] = array();
}
ถ้า (!is_array($values["error"])) (
// ไวยากรณ์ปกติ
$files[$name] = $values;
) อื่น (
// คุณสมบัติอาร์เรย์ html
foreach ($ค่าเป็น $fileInfoKey => $subArray) (
$files[$name] = array_replace_recursive($files[$name], $walker($subArray, $fileInfoKey, $walker));
}
}
}
ส่งคืนไฟล์ $;
}
10 ปีที่แล้ว
หากคุณลองอัปโหลดไฟล์ที่มีชื่อหลายมิติดังนี้:
คุณจะได้รับรูปแบบที่ไม่คาดคิดเช่นนี้:
อาร์เรย์(
"ส่ง" => อาร์เรย์
"name" => array("screenshot" => "monster_wallpaper.jpg" ),
"type" => array("screenshot" => "image/jpeg" ),
"tmp_name" => array("screenshot" => "/tmp/php48lX2Y" ),
"error" => array("screenshot" => 0 ),
"size" => array("screenshot" => 223262 ),
),
....
?>
คุณสามารถใช้ฟังก์ชันต่อไปนี้เพื่อจัดรูปแบบอาร์เรย์ซ้ำในรูปแบบปกติ:
ฟังก์ชั่น format_files_array ($ไฟล์, $name = null, & $new = false, $path = false)(
$names = array("name" => "name" , "type" => "type" , "tmp_name" => "tmp_name" , "error" => "error" , "size" => "size" ) ;
Foreach($files as $key => & $part )
{
$คีย์ = (สตริง) $คีย์ ;
ถ้า(in_array ($คีย์, $ชื่อ))
$ชื่อ = $คีย์ ;
if(! in_array ($คีย์, $ชื่อ))
$path = $คีย์ ;
ถ้า(is_array($ส่วนหนึ่ง))
$part = format_files_array ($ส่วนหนึ่ง, $ชื่อ, $ใหม่, $path);
elseif(! is_array($ส่วนหนึ่ง))
{
$ปัจจุบัน =& $ใหม่ ;
foreach($เส้นทางเป็น $p)
$ปัจจุบัน =& $ปัจจุบัน [ $p ];
$ปัจจุบัน [ $ชื่อ ] = $ส่วนหนึ่ง ;
ไม่ได้ตั้งค่า($เส้นทาง);
$ชื่อ = โมฆะ ;
}
}
ส่งคืน $ ใหม่ ;
}
?>
ใน PHP คุณมักจะต้องอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์...เป็นเรื่องดีถ้าไซต์ของคุณมีความสามารถในการอัปโหลดไฟล์ไปยังไซต์: รูปภาพหรือไฟล์ข้อความอื่นๆ หรือรูปแบบอื่นๆ...เราจะพูดถึงเรื่องนี้ในบทความนี้ ...
ดังนั้นเราจึงจำเป็นต้องเรียนรู้วิธีอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์โดยใช้ PHP ในการทำเช่นนี้เราจำเป็นต้องรู้ว่าการดาวน์โหลดดังกล่าวเกิดขึ้นโดยใช้วิธีง่ายๆ แบบฟอร์มหลายส่วนซึ่งมีช่องพิเศษสำหรับอัพโหลดไฟล์
พารามิเตอร์ enctype ในแบบฟอร์มนี้ต้องตั้งค่าเป็น multipart/form-data ส่งโดยใช้วิธี POST
วิธีการประมวลผลแบบฟอร์มหลายส่วนใน PHP
หลังจากคลิกปุ่ม "อัปโหลด" แล้ว PHP จะวางไฟล์ไว้ในไดเร็กทอรีชั่วคราวและตั้งชื่อไฟล์ชั่วคราว (แตกต่างจากชื่อที่กำลังโหลด คุณจะเห็นด้านล่าง) และทันทีที่ตัวแปร 4 ตัวของอาเรย์ส่วนกลาง $_FILES ถูกสร้างขึ้น:
- $_FILES["อัพโหลดไฟล์"]["ชื่อ"]- ชื่อของไฟล์ก่อนที่จะถูกส่งไปยังเซิร์ฟเวอร์ (นั่นคือต้นฉบับ)
- $_FILES["อัพโหลดไฟล์"]["ขนาด"]- ขนาดของไฟล์ที่ได้รับเป็นไบต์
- $_FILES["อัพโหลดไฟล์"]["ประเภท"]- ประเภท MIME ของไฟล์ที่ได้รับ (หากเบราว์เซอร์ตรวจพบได้) เช่น image/gif, image/png, image/jpeg, text/html;
- $_FILES["อัพโหลดไฟล์"]["tmp_name"]- มีชื่อของไฟล์ในไดเร็กทอรีชั่วคราว เช่น /tmp/php57Opq2Y;
- $_FILES["uploadfile"]["error"] - รหัสข้อผิดพลาดที่อาจเกิดขึ้นเมื่ออัพโหลดไฟล์ สำคัญ ["ข้อผิดพลาด"]ถูกเพิ่มเข้ามาใน PHP 4.2.0
โปรดทราบ: หลังจากเสร็จสิ้นสคริปต์สำหรับการอัพโหลดไฟล์ขึ้นเซิร์ฟเวอร์ ไฟล์ชั่วคราวจะถูกลบ ดังนั้นคุณต้องคัดลอกไฟล์นี้จากไดเร็กทอรีชั่วคราวไปยังบางโฟลเดอร์ เช่น ไฟล์ที่ใช้ฟังก์ชัน สำเนา()- ไม่จำเป็นต้องใช้ฟังก์ชัน move() เนื่องจากการคัดลอกในขณะนี้มีข้อดี 2 ประการ: ไฟล์ชั่วคราวจะถูกลบด้วยตัวเอง และหากไดเร็กทอรีชั่วคราวอยู่บนสื่ออื่น ข้อผิดพลาดจะปรากฏขึ้น
เบาะแส: กระบวนการควรเริ่มต้นตามเงื่อนไขของการกดปุ่ม "ดาวน์โหลด" นั่นคือ ตัวอย่างเช่น: if($_POST["submit"])(จากนั้นดำเนินการ)
รูปภาพที่แสดงตัวแปรที่สร้างขึ้น 4 ตัวของอาเรย์ส่วนกลาง $_FILES อย่างชัดเจน:
ฉันคิดว่าตอนนี้ทุกอย่างชัดเจนสำหรับคุณ อะไรไปที่ไหน และอะไรถูกสร้างขึ้นที่ไหน... จากนั้นฉันก็จัดการฟิลด์เหล่านี้ เราสามารถเริ่มทำงานกับแบบฟอร์มนี้ใน PHP
สคริปต์อาจมีลักษณะดังนี้:
ถ้า($_POST["ส่ง"])(
@mkdir("ไฟล์", 0777); // สร้างโฟลเดอร์ หากไม่มีก็จะไม่มีข้อผิดพลาด ให้ตั้งค่าสิทธิ์
/*เอคโค่ "
";";*/
print_r($_FILES);
เสียงสะท้อน "
$uploaddir = "ไฟล์/";
$uploadfile = $uploaddir.basename($_FILES["uploadfile"]["name"]);
ถ้า(คัดลอก($_FILES["uploadfile"]["tmp_name"], $uploadfile))(
เสียงสะท้อน "
อัปโหลดไฟล์ไปยังเซิร์ฟเวอร์สำเร็จแล้ว
";)อื่น(
เสียงสะท้อน "
ไม่สามารถอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์
";ออก;
}
//ข้อมูลเกี่ยวกับไฟล์ที่ดาวน์โหลด
เสียงสะท้อน "
ข้อมูลเกี่ยวกับไฟล์ที่อัพโหลดไปยังเซิร์ฟเวอร์:
";เสียงสะท้อน "
ชื่อเดิมของไฟล์ที่อัพโหลด: ".$_FILES["อัพโหลดไฟล์"]["ชื่อ"]"
";เสียงสะท้อน "
ประเภท Mime ของไฟล์ที่อัปโหลด: ".$_FILES["อัพโหลดไฟล์"]["ประเภท"]"
";เสียงสะท้อน "
ขนาดไฟล์ที่อัปโหลดเป็นไบต์: ".$_FILES["อัพโหลดไฟล์"]["ขนาด"]"
";เสียงสะท้อน "
ชื่อไฟล์ชั่วคราว: ".$_FILES["uploadfile"]["tmp_name"]"
";}
นี่คือวิธีที่กระบวนการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์โดยใช้ PHP เกิดขึ้น
ฉันหวังว่ามันจะเป็นประโยชน์กับใครบางคน!
19กวันนี้ผมอยากจะบอกคุณเกี่ยวกับสถานการณ์ต่างๆ ที่เกี่ยวข้องกับการอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์โดยใช้สคริปต์ PHP ฉันจะพยายามยกตัวอย่างทั้งการอัปโหลดไฟล์ที่ง่ายที่สุดและการอัปโหลดหลายรายการโดยใช้ PHP ไฟล์ที่อัปโหลด
เพื่ออัพโหลดไฟล์ขึ้นเซิร์ฟเวอร์ ก่อนอื่น คุณต้องสร้างแบบฟอร์ม HTML พร้อมช่องใส่ไฟล์ จากนั้นแนบสคริปต์ PHP ซึ่งจะย้ายไฟล์ไปยังไดเร็กทอรีที่ระบุ หากต้องการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์โดยใช้สคริปต์ PHP ให้ทำตามขั้นตอนเหล่านี้:
- สร้างแบบฟอร์ม HTML อย่างง่าย: คุณจะต้องมีแบบฟอร์มที่เรียบง่ายพร้อมความสามารถในการระบุไฟล์ ตั้งอยู่ในไฟล์ basic.php:
การอัพโหลดไฟล์พื้นฐาน
ต้องใช้โค้ดด้านบนเพื่อสร้างแบบฟอร์ม เมื่อผู้ใช้เลือกไฟล์และคลิกปุ่มอัปโหลด แบบฟอร์มจะส่งข้อมูลโดยใช้วิธี POST ในหน้าเดียวกัน เนื่องจากไฟล์ basic.php ถูกระบุเป็นตัวจัดการ:
สำคัญ: อย่าลืมเพิ่ม enctype=”multipart/form-data” ลงในแท็ก .
- เราสร้างสคริปต์ PHP เพื่อประมวลผลแบบฟอร์มดาวน์โหลด ใน PHP ข้อมูลทั้งหมดเกี่ยวกับไฟล์ที่อัพโหลดจะอยู่ในตัวแปรโกลบอล $_FILES นั่นคือการใช้ $_FILES คุณสามารถตรวจสอบว่าไฟล์ถูกดาวน์โหลดหรือไม่ หากอัปโหลดไฟล์แล้ว คุณสามารถย้ายไปยังไดเร็กทอรีที่ต้องการได้โดยใช้ฟังก์ชัน PHP move_uploaded_file:
รหัสด้านบนจะตรวจสอบว่าผู้ใช้ดาวน์โหลดไฟล์หรือไม่ หากดาวน์โหลดไฟล์แล้ว เราจะย้ายไฟล์ไปยังไดเร็กทอรีที่ระบุ ในสคริปต์ข้างต้น เรากำลังย้ายไฟล์ไปยังโฟลเดอร์เดียวกับที่มีไฟล์ basic.php อยู่
ด้านล่างนี้เป็นฉบับสมบูรณ์ ตัวอย่างไฟล์ที่อัพโหลดด้วยการย้ายเวอร์ชัน PHP:
การอัพโหลดไฟล์พื้นฐาน
โปรดอย่าทดสอบตัวอย่างไฟล์ที่อัปโหลดการย้าย PHP นี้บนเซิร์ฟเวอร์ ไม่เป็นไปตามข้อกำหนดด้านความปลอดภัยและสร้างขึ้นเพื่อสาธิตวิธีการอัปโหลดไฟล์โดยใช้ PHP โดยเฉพาะ
คำถาม: เหตุใดสคริปต์ข้างต้นจึงไม่ปลอดภัย
คำตอบ: การใช้สคริปต์ด้านบนทำให้คุณสามารถอัปโหลดไฟล์ประเภทใดก็ได้ไปยังเซิร์ฟเวอร์ นั่นคือหากคุณใช้สคริปต์ในรูปแบบนี้บนเซิร์ฟเวอร์ "สด" แฮ็กเกอร์ทุกคนจะสามารถอัปโหลดสคริปต์ PHP ของตนเองและแฮ็กไซต์และเซิร์ฟเวอร์ของคุณได้
อีกไม่นานเราจะพูดถึงรายละเอียดเพิ่มเติมเกี่ยวกับการปกป้องสคริปต์สำหรับการอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์
$_FILES คืออะไร?
$_FILES เป็นตัวแปรโกลบอลใน PHP เช่น $_POST หรือ $_GET เป็นอาเรย์แบบเชื่อมโยงที่มีข้อมูลเกี่ยวกับไฟล์ที่อัพโหลดโดยใช้วิธี HTTP POST
นั่นคือ ถ้าเรารัน print_r($_FILES) สำหรับสคริปต์ด้านบน เราจะได้รับข้อมูลต่อไปนี้:
อาร์เรย์ ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))
นั่นก็คือสำหรับแต่ละสาขา องค์ประกอบถูกสร้างขึ้นในอาร์เรย์ ถ้าคุณสร้าง จากนั้นชื่อองค์ประกอบก็จะเปลี่ยนไปเป็น test ด้วย ตัวอย่างเช่น:
อาร์เรย์ ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))
ตอนนี้ สำหรับแต่ละไฟล์อินพุตที่ย้ายโดยใช้ไฟล์ PHP ที่อัปโหลดแล้ว จะมีการสร้างองค์ประกอบห้ารายการ ( ชื่อ, พิมพ์, tmp_name, ข้อผิดพลาด, ขนาด- มาดูองค์ประกอบเหล่านี้ให้ละเอียดยิ่งขึ้น:
- ชื่อ: มีชื่อของไฟล์ที่อัพโหลดโดยผู้ใช้ หากคุณโหลดไฟล์ abc.txt ลงในเบราว์เซอร์ องค์ประกอบชื่อจะถูกเรียกว่า abc.txt
- type: ประเภทของไฟล์ที่อัพโหลดหรือประเภท mime ให้ชัดเจนยิ่งขึ้น สำหรับไฟล์ JPG องค์ประกอบนี้จะมีค่า image/jpeg หากคุณโหลดข้อความ องค์ประกอบจะได้รับค่า text/plain ประเภท mime จะแตกต่างกันไปสำหรับไฟล์ประเภทต่างๆ ด้านล่างนี้เป็นประเภทละครใบ้ที่พบบ่อยที่สุด:
- JPEG: รูปภาพ/jpeg ;
- PNG: รูปภาพ/png ;
- ข้อความ: ข้อความ/ธรรมดา ;
- คำ: application/msword.
- tmp_name: ตำแหน่งชั่วคราวสำหรับไฟล์ที่ดาวน์โหลด เส้นทางนี้สามารถเปลี่ยนแปลงได้ในตัวแปร upload_tmp_dir ที่ระบุในไฟล์ php.ini
- ข้อผิดพลาด: ข้อมูลข้อผิดพลาด รวมถึงประเภทของข้อผิดพลาดที่พบในระหว่างกระบวนการดาวน์โหลด ตัวอย่างเช่น เมื่อขนาดไฟล์เกินขนาดสูงสุด หรือเมื่อไม่ได้ระบุไฟล์ให้ดาวน์โหลด สำหรับข้อผิดพลาดใดๆ ที่เกิดขึ้น จะมีค่าตัวเลขและค่าคงที่ ด้านล่างนี้คือรายการข้อผิดพลาดทั้งหมดที่อาจเกิดขึ้น ตัวอย่างไฟล์ที่อัพโหลด PHP ย้าย:
- UPLOAD_ERR_OK (ค่า 0)- บ่งชี้ว่าดาวน์โหลดไฟล์ได้สำเร็จโดยไม่มีข้อผิดพลาด
- UPLOAD_ERR_INI_SIZE (ค่า 1)- ขนาดไฟล์เกินที่ระบุในตัวแปร upload_max_filesize ในไฟล์ php.ini
- UPLOAD_ERR_FORM_SIZE (ค่า 2)- ขนาดไฟล์เกินค่าที่ตั้งไว้ในตัวแปรรูปแบบ MAX_FILE_SIZE
- UPLOAD_ERR_PARTIAL (ค่า 3)- ไฟล์นี้ยังไม่ได้รับการดาวน์โหลดอย่างสมบูรณ์
- UPLOAD_ERR_NO_FILE (ค่า 4)- ไม่มีไฟล์ให้ดาวน์โหลด
- UPLOAD_ERR_NO_TMP_DIR (ค่า 6)- ไม่มีไดเร็กทอรีที่ระบุสำหรับการจัดเก็บชั่วคราว
- UPLOAD_ERR_CANT_WRITE (ค่า 7)- ไม่สามารถเขียนไฟล์ลงดิสก์ได้
- ขนาด: ขนาดของไฟล์ที่อัพโหลดเป็นไบต์
move_uploaded_file คืออะไร
move_uploaded_file เป็นฟังก์ชันที่ย้ายไฟล์ที่อัพโหลดจากไดเร็กทอรีชั่วคราวไปยังโฟลเดอร์ปลายทาง ก่อนที่จะย้าย move_uploaded_file PHP จะตรวจสอบว่าไฟล์ที่ระบุในวิธีโพสต์ HTTP ได้รับการอัปโหลดหรือไม่
หากย้ายไฟล์สำเร็จ คุณจะได้รับคำตอบจริงหรือเท็จ ในตัวอย่างแรกเราใช้บรรทัดโค้ดต่อไปนี้:
move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)
ตอนนี้เรามาทำมันให้ดีแล้วแสดงข้อมูล:
if(move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir))( echo "อัพโหลดไฟล์แล้ว" ) else( echo "ไม่ได้อัพโหลดไฟล์" )
การเปลี่ยนแปลงขีดจำกัดขนาดไฟล์อัพโหลด
แบบฟอร์มการอัปโหลดไฟล์แต่ละไฟล์ต้องมีขีดจำกัดขนาด ไม่เช่นนั้นผู้ใช้จะต้องอัปโหลดไฟล์ขนาดใหญ่ มีสองวิธีในการกำหนดขีดจำกัดการย้ายไฟล์ที่อัปโหลด PHP:
- ไฟล์ PHP.ini มีตัวแปรพิเศษ upload_max_filesize ซึ่งรับผิดชอบขนาดสูงสุดของไฟล์ที่อัพโหลด ต่อไปนี้เป็นบรรทัดจาก php.ini ที่จำกัดขนาดของไฟล์ที่อัพโหลดไว้ที่ 20 MB: upload_max_filesize = 20M
- หากไฟล์ที่อัพโหลดมีขนาดใหญ่กว่า ผู้ใช้จะได้รับข้อผิดพลาด UPLOAD_ERR_INI_SIZE หรือค่า “2” ในตัวแปร $_FILES สิ่งสำคัญคือต้องทราบว่าค่าของตัวแปร upload_max_filesize ไม่ควรเกินค่าของตัวแปร post_max_size ที่ระบุใน php.ini
- คุณสามารถจำกัดขนาดของไฟล์ที่อัปโหลดได้โดยการวางองค์ประกอบอินพุตที่ซ่อนอยู่ที่เรียกว่า UPLOAD_ERR_INI_SIZE ในแบบฟอร์มการอัปโหลด คุณสามารถทำได้เช่นนี้: .
หากคุณต้องการเพิ่มขนาดไฟล์อย่างมาก อย่าลืมเปลี่ยนเวลาดำเนินการของสคริปต์ PHP
วิธีรักษาความปลอดภัยสคริปต์อัพโหลดไฟล์ PHP
ตอนนี้คุณรู้วิธีจำกัดขนาดของไฟล์ที่อัปโหลดและรู้วิธีระบุประเภทไฟล์ที่ผู้ใช้อัปโหลด ถึงเวลาดูแลความปลอดภัยของตัวอย่างไฟล์ที่อัพโหลดการย้าย PHP ของเราแล้ว
ตามตัวอย่าง เราจะป้องกันไม่ให้ผู้ใช้อัปโหลดไฟล์ jpeg ที่มีขนาดใหญ่กว่า 1 MB ตั้งค่าขีดจำกัดที่เหมาะสมในตัวแปร upload_max_filesize ในไฟล์ php.ini ด้านล่างนี้เป็นสคริปต์เวอร์ชันปรับปรุง:
อัพโหลดไฟล์อย่างปลอดภัย
การอัปโหลดไฟล์หลายไฟล์โดยใช้สคริปต์ PHP
คุณสามารถอัปโหลดหลายไฟล์พร้อมกันได้โดยใช้ $_FILES และ move_uploaded_file PHP ด้านล่างนี้ ฉันจะบอกคุณเกี่ยวกับสองวิธีในการอัปโหลดไฟล์หลายไฟล์โดยใช้สคริปต์ PHP:
- การใช้ชื่ออินพุตที่แตกต่างกัน
- ใช้ชื่ออินพุตเดียวกัน แต่ใช้อาร์เรย์
1. การใช้ชื่ออินพุตที่แตกต่างกัน:
คุณสามารถอัปโหลดหลายไฟล์พร้อมกันได้โดยใช้องค์ประกอบอินพุตหลายรายการ ตามที่กล่าวไว้ข้างต้น ถ้าเราสร้างองค์ประกอบอินพุตหลายรายการ องค์ประกอบหลักหลายรายการจะถูกสร้างขึ้นใน $_FILES ตัวอย่างเช่น สำหรับแบบฟอร์มด้านล่าง:
$_FILES จะนำเสนออาร์เรย์ที่มีเนื้อหาดังต่อไปนี้:
อาร์เรย์ ( => Array ( => 20141002_094257.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpoBWrBZ => 0 => 2669096) => Array ( => 20141002_094247.jpg => image/jpeg = > /Applications/XAMPP/xamppfiles/temp/phpjwUmVZ => 0 => 2207657))
ตัวอย่างไฟล์ที่อัปโหลดการย้าย PHP ด้านล่างควรเขียนโดยคำนึงถึงข้อเท็จจริงที่ว่าองค์ประกอบหนึ่งมีไว้สำหรับอวตาร (รูปภาพ) และอีกองค์ประกอบหนึ่งมีไว้สำหรับอัปโหลดเรซูเม่ ( ไฟล์ในรูปแบบ .doc):
อัพโหลดหลายไฟล์
2. เราใช้ช่องป้อนข้อมูลเดียว แต่ใช้อาร์เรย์:
เช่นเดียวกับประเภทอินพุตอื่นๆ สำหรับการย้ายไฟล์ที่อัปโหลด PHP เราสามารถใช้อาร์เรย์ที่มีประเภทอินพุตที่ระบุใน php นั่นคือ:
นั่นคือสำหรับ HTML ข้างต้น $_FILES จะให้ข้อมูลที่มีโครงสร้างต่อไปนี้:
อาร์เรย์ ( => อาร์เรย์ ( => อาร์เรย์ ( => upload-file-php.jpg => ขอบเขตตัวแปร php.jpg => magic-constants.jpg) => อาร์เรย์ ( => รูปภาพ/jpeg => รูปภาพ/jpeg => image/jpeg) => Array ( => /Applications/XAMPP/xamppfiles/temp/phpML5kOy => /Applications/XAMPP/xamppfiles/temp/phpNZbuw7 => /Applications/XAMPP/xamppfiles/temp/phpO8VFAk) => Array ( => 0 => 0 => 0) => อาร์เรย์ ( => 6887 => 8036 => 9967)))
ดาวน์โหลดโค้ดที่ใช้ในบทความ
เอกสารเผยแพร่นี้เป็นการแปลบทความ “การอัปโหลดไฟล์ด้วยสคริปต์ PHP” ซึ่งจัดทำโดยทีมงานโครงการที่เป็นมิตร
แต่ในตอนแรกฉันอยากจะพูดสองสามคำเกี่ยวกับวิธีการดาวน์โหลดไฟล์
สำหรับสิ่งนี้ เราจำเป็นต้องมีแบบฟอร์ม html ที่มีช่องป้อนข้อมูลดังนี้ - นอกจากนี้หากต้องการถ่ายโอนไฟล์ไปยังเซิร์ฟเวอร์คุณต้องตั้งค่าประเภทแบบฟอร์มเป็น หลายส่วน- เมื่อต้องการทำเช่นนี้เป็นพารามิเตอร์ เข้ารหัสมีการระบุค่า หลายส่วน / แบบฟอร์มข้อมูล.
หลังจากที่เราวางแบบฟอร์มพร้อมฟิลด์บนหน้า html ฟิลด์จะปรากฏในหน้าต่างเบราว์เซอร์เพื่อให้คุณสามารถเลือกไฟล์ในคอมพิวเตอร์ของคุณได้
หลังจากที่ผู้ใช้เลือกไฟล์ที่ต้องการแล้วคลิกปุ่ม “อัปโหลด” แบบฟอร์มจะถ่ายโอนข้อมูลไปยังสคริปต์ php ไปยังเซิร์ฟเวอร์ที่ระบุใน การกระทำแบบฟอร์ม หากการกระทำของแบบฟอร์มว่างเปล่า ข้อมูลจะถูกโอนไปยังไฟล์เดียวกันกับที่แบบฟอร์มนั้นอยู่ ข้อมูลทั้งหมดเกี่ยวกับไฟล์ที่ดาวน์โหลดจะถูกวางไว้ในอาร์เรย์ $_ไฟล์- สิ่งที่เราต้องทำคือดึงข้อมูลนี้และย้ายไฟล์ไปยังตำแหน่งที่เราต้องการ
ก่อนที่คุณจะเริ่มเขียนสคริปต์ประมวลผล แบบฟอร์มหลายส่วนคุณต้องแก้ไขไฟล์การกำหนดค่า php.iniเพื่ออนุญาตให้อัพโหลดไฟล์ไปยังเซิร์ฟเวอร์
ไฟล์คอนฟิกูเรชัน PHP php.iniมีพารามิเตอร์สามตัวที่เกี่ยวข้องกับการอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์:
- file_uploads = เปิด - อนุญาตให้อัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ผ่าน HTTP;
- upoad_tmp_dir = /tmp - ตั้งค่าไดเร็กทอรีสำหรับจัดเก็บไฟล์ที่ดาวน์โหลดชั่วคราว
- upload_max_filesize = 2M - กำหนดขนาดสูงสุดของไฟล์ที่อัพโหลด
ดังนั้นให้สร้างไฟล์ใหม่ชื่อ อัพโหลด.phpและคัดลอกโค้ดต่อไปนี้ลงไป