PHP ดาวน์โหลดไฟล์หลายไฟล์ การอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์โดยใช้ PHP move_uploaded_file คืออะไร

สามารถอัปโหลดหลายไฟล์ได้โดยใช้ไฟล์ที่แตกต่างกัน ชื่อสำหรับ ป้อนข้อมูล.

นอกจากนี้ยังสามารถอัปโหลดหลายไฟล์พร้อมกันและจัดเรียงข้อมูลโดยอัตโนมัติเป็นอาร์เรย์ให้กับคุณได้ ในการทำเช่นนั้น คุณต้องใช้ไวยากรณ์การส่งอาร์เรย์เดียวกันในรูปแบบ 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 ให้ทำตามขั้นตอนเหล่านี้:

  1. สร้างแบบฟอร์ม HTML อย่างง่าย: คุณจะต้องมีแบบฟอร์มที่เรียบง่ายพร้อมความสามารถในการระบุไฟล์ ตั้งอยู่ในไฟล์ basic.php:

การอัพโหลดไฟล์พื้นฐาน

การอัพโหลดไฟล์พื้นฐาน




ต้องใช้โค้ดด้านบนเพื่อสร้างแบบฟอร์ม เมื่อผู้ใช้เลือกไฟล์และคลิกปุ่มอัปโหลด แบบฟอร์มจะส่งข้อมูลโดยใช้วิธี POST ในหน้าเดียวกัน เนื่องจากไฟล์ basic.php ถูกระบุเป็นตัวจัดการ:

สำคัญ: อย่าลืมเพิ่ม enctype=”multipart/form-data” ลงในแท็ก

.

  1. เราสร้างสคริปต์ 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, ข้อผิดพลาด, ขนาด- มาดูองค์ประกอบเหล่านี้ให้ละเอียดยิ่งขึ้น:

  1. ชื่อ: มีชื่อของไฟล์ที่อัพโหลดโดยผู้ใช้ หากคุณโหลดไฟล์ abc.txt ลงในเบราว์เซอร์ องค์ประกอบชื่อจะถูกเรียกว่า abc.txt
  2. type: ประเภทของไฟล์ที่อัพโหลดหรือประเภท mime ให้ชัดเจนยิ่งขึ้น สำหรับไฟล์ JPG องค์ประกอบนี้จะมีค่า image/jpeg หากคุณโหลดข้อความ องค์ประกอบจะได้รับค่า text/plain ประเภท mime จะแตกต่างกันไปสำหรับไฟล์ประเภทต่างๆ ด้านล่างนี้เป็นประเภทละครใบ้ที่พบบ่อยที่สุด:
  • JPEG: รูปภาพ/jpeg ;
  • PNG: รูปภาพ/png ;
  • ข้อความ: ข้อความ/ธรรมดา ;
  • คำ: application/msword.
  1. tmp_name: ตำแหน่งชั่วคราวสำหรับไฟล์ที่ดาวน์โหลด เส้นทางนี้สามารถเปลี่ยนแปลงได้ในตัวแปร upload_tmp_dir ที่ระบุในไฟล์ php.ini
  1. ข้อผิดพลาด: ข้อมูลข้อผิดพลาด รวมถึงประเภทของข้อผิดพลาดที่พบในระหว่างกระบวนการดาวน์โหลด ตัวอย่างเช่น เมื่อขนาดไฟล์เกินขนาดสูงสุด หรือเมื่อไม่ได้ระบุไฟล์ให้ดาวน์โหลด สำหรับข้อผิดพลาดใดๆ ที่เกิดขึ้น จะมีค่าตัวเลขและค่าคงที่ ด้านล่างนี้คือรายการข้อผิดพลาดทั้งหมดที่อาจเกิดขึ้น ตัวอย่างไฟล์ที่อัพโหลด 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)- ไม่สามารถเขียนไฟล์ลงดิสก์ได้
  1. ขนาด: ขนาดของไฟล์ที่อัพโหลดเป็นไบต์

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. การใช้ชื่ออินพุตที่แตกต่างกัน
  2. ใช้ชื่ออินพุตเดียวกัน แต่ใช้อาร์เรย์

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และคัดลอกโค้ดต่อไปนี้ลงไป



หากคุณดูแบบฟอร์มอย่างใกล้ชิด คุณจะเห็นฟิลด์ที่ซ่อนอยู่

มันระบุขนาดสูงสุดของไฟล์ที่ได้รับในหน่วยไบต์ แต่คุณไม่ควรเชื่อถือค่านี้ เนื่องจากเป็นเพียงค่าแจ้งเตือนและสามารถข้ามได้อย่างง่ายดาย! ดังนั้นจงจำไว้!

หลังจากที่ผู้ใช้เลือกไฟล์และคลิกที่ปุ่ม "อัปโหลด" ข้อมูลทั้งหมดเกี่ยวกับไฟล์ดังที่ได้กล่าวไว้ข้างต้นจะถูกวางไว้ในอาร์เรย์ $_FILES และตัวไฟล์นั้นจะถูกวางไว้ในไดเร็กทอรีชั่วคราวบนเซิร์ฟเวอร์ซึ่งก็คือ ระบุไว้ใน php.ini

เนื่องจากฟิลด์ไฟล์ถูกเรียก ชื่อ = "อัพโหลดไฟล์"จากนั้นอาร์เรย์ $_FILES จะมีอาร์เรย์ที่เชื่อมโยงกับคีย์ "อัพโหลดไฟล์" .

  • $_FILES[" uploadFile "]["name"] - ชื่อของไฟล์ก่อนส่งไปยังเซิร์ฟเวอร์ เช่น pict.gif
  • $_FILES[" uploadFile "]["size"] - ขนาดของไฟล์ที่ได้รับเป็นไบต์;
  • $_FILES[" uploadFile "]["type"] - ประเภท MIME ของไฟล์ที่ได้รับ (หากเบราว์เซอร์ตรวจพบได้) เช่น image/gif, image/png, image/jpeg, text/html;
  • $_FILES[" uploadFile "]["tmp_name"] - มีชื่อของไฟล์ในไดเร็กทอรีชั่วคราว เช่น: /tmp/phpV3b3qY;
  • $_FILES[" uploadFile "]["error"] - รหัสข้อผิดพลาดที่อาจเกิดขึ้นเมื่ออัพโหลดไฟล์

หลังจากสคริปต์เสร็จสิ้น ไฟล์ชั่วคราวจะถูกลบ ซึ่งหมายความว่าเราต้องคัดลอกไปยังตำแหน่งอื่นก่อนที่สคริปต์จะเสร็จสมบูรณ์

ดังนั้นเราจึงหาอัลกอริธึมได้! ทีนี้มาดูโค้ดกัน

ก่อนอื่น เราจะตรวจสอบว่ามีการคลิกปุ่มส่งหรือไม่

ถ้า(isset($_POST["อัปโหลด"])) ( )

If(is_uploaded_file($_FILES["uploadFile"]["tmp_name"])) ( ดำเนินการกับไฟล์ ) else ( echo "ไม่ได้อัปโหลดไฟล์"; )

หากดาวน์โหลดไฟล์ผ่าน HTTP POST เราจะย้ายไฟล์จากไดเร็กทอรีชั่วคราวไปยังไดเร็กทอรีที่เราต้องการ ซึ่งทำได้โดยใช้ฟังก์ชัน move_uploaded_file ซึ่งรับพารามิเตอร์สองตัว ได้แก่ ชื่อไฟล์ที่จะอัปโหลดและเส้นทางที่จะย้ายไฟล์ หากย้ายไฟล์สำเร็จ ฟังก์ชันนี้จะคืนค่าเป็นจริง มิฉะนั้น - เท็จ

If(move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $uploadedFile)) ( echo File uploaded; ) else ( echo เกิดข้อผิดพลาดขณะอัพโหลดไฟล์; )

ในกรณีของเรา ชื่อของไฟล์คือชื่อของไฟล์ชั่วคราวบนเซิร์ฟเวอร์ - $_FILES["uploadFile"]["tmp_name"] และไดเร็กทอรีที่จะย้ายไฟล์คือตัวแปร $uploadedFile ซึ่งก็คือ ประกาศข้างต้นในสคริปต์และมีตำแหน่งจัดเก็บไฟล์ใหม่

$folder = "เส้นทาง/ถึง/โฟลเดอร์/"; $uploadedFile = $folder. ชื่อฐาน($_FILES["uploadFile"]["name"]);

จากประสบการณ์ของฉัน ฉันสามารถพูดได้ว่าไม่มีประโยชน์ที่จะจัดเก็บชื่อไฟล์ต้นฉบับไว้บนเซิร์ฟเวอร์ ดังนั้นคุณจึงสามารถเปลี่ยนชื่อได้ ในการดำเนินการนี้ เราจะสร้างชื่อแบบสุ่มสำหรับไฟล์ของเรา และฟังก์ชัน move_uploaded_file() จะย้ายและเปลี่ยนชื่อไฟล์ของเรา:

// รับนามสกุลไฟล์ $file_ext = strtolower(strrchr($_FILES["uploadFile"]["name"],."")); // สร้างตัวเลขสุ่ม $file_name = uniqid(rand(10000.99999)); // สร้างเส้นทางบนเซิร์ฟเวอร์ $uploadedFile = $folder.$file_name.$file_ext;

และสุดท้ายนี่คือรายการข้อผิดพลาดที่อาจเกิดขึ้นเมื่ออัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ ฉันขอเตือนคุณว่ารหัสข้อผิดพลาดถูกจัดเก็บไว้ในตัวแปร $_FILES[" uploadFile "]["error"]:

  • 0- ไม่มีข้อผิดพลาดเกิดขึ้น ไฟล์ถูกอัพโหลดไปยังเซิร์ฟเวอร์สำเร็จแล้ว
  • 1- ขนาดของไฟล์ที่ได้รับเกินขนาดสูงสุดที่อนุญาต ซึ่งระบุโดยคำสั่ง upload_max_filesize ของไฟล์การกำหนดค่า php.ini
  • 2- ขนาดไฟล์อัปโหลดเกินค่า MAX_FILE_SIZEระบุไว้ในรูปแบบ HTML
  • 3- ไฟล์ที่ดาวน์โหลดได้รับเพียงบางส่วนเท่านั้น
  • 4- ไฟล์ไม่ได้รับการดาวน์โหลด
  • 6- ไม่มีโฟลเดอร์ชั่วคราว
  • 7- ความล้มเหลวในการเขียนไฟล์ลงดิสก์

อย่างที่คุณเห็น การจัดการอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์นั้นไม่ใช่เรื่องยาก การรับรองระดับความปลอดภัยที่ต้องการนั้นยากกว่า เนื่องจากผู้โจมตีสามารถใช้การอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์เพื่อโจมตีเซิร์ฟเวอร์ได้

เมื่อใช้สคริปต์ของเรา ผู้โจมตีจะสามารถอัปโหลดไฟล์ที่กำหนดเองไปยังเซิร์ฟเวอร์ได้ ตัวอย่างเช่น เขาจะสามารถอัปโหลดสคริปต์ PHP ไปยังเซิร์ฟเวอร์ ซึ่งสามารถลบไฟล์ทั้งหมดของคุณบนเซิร์ฟเวอร์หรือเชลล์ PHP แบบวนซ้ำ ดังนั้นหากคุณ เขียนโปรแกรมอัพโหลดไฟล์ของคุณเอง จากนั้นเรื่องนี้จะต้องดำเนินการอย่างจริงจังโดยไม่พลาดสิ่งใด

ในตัวอย่างของเรา ฉันไม่ได้ตั้งค่างานดังกล่าว แต่แสดงให้คุณเห็นถึงกลไกทั้งหมดในการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์เท่านั้น แต่ในบทความถัดไป ฉันจะแสดงวิธีรับรองระดับความปลอดภัยที่จำเป็น!

ในปัจจุบัน บริการสำหรับการอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ (โฮสติ้ง) พบได้บนเว็บไซต์เครือข่ายสังคม กระดานข้อความ เว็บไซต์หาคู่ ฯลฯ สิ่งสำคัญคือการช่วยให้ผู้เยี่ยมชมทรัพยากรบนเว็บสามารถเผยแพร่ไฟล์ของพวกเขาได้ (ภาพถ่าย เอกสาร) บนอินเทอร์เน็ต

มีข้อเสียที่สำคัญประการหนึ่งเมื่อให้บริการนี้ ความจริงก็คือการอนุญาตให้อัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ของเรานั้น เท่ากับว่าเรากำลังติดตั้งประตูด้านหลังซึ่งจำเป็นต้องมีการตรวจสอบอย่างต่อเนื่อง เนื่องจากไฟล์ของผู้เยี่ยมชมอาจไม่เพียงมีข้อมูลที่เป็นประโยชน์เท่านั้น แต่ยังมีรหัสไวรัล ซึ่งต่อมาสามารถเปิดให้ผู้โจมตีเข้ายึดเซิร์ฟเวอร์ของคุณได้ ด้วยข้อเสียนี้ จึงจำเป็นต้องตรวจสอบไฟล์อย่างรอบคอบก่อนที่จะอัพโหลดไปยังเซิร์ฟเวอร์

แต่ฉันจะไม่ข่มขู่คุณ แต่ขอนำเสนอฟังก์ชันสำเร็จรูป (สคริปต์ PHP) สำหรับตรวจสอบและอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ ฟังก์ชั่นนี้ทำงานได้ 100% ฉันใช้มันเองบนเว็บไซต์ของฉัน ฟังก์ชั่นนี้เขียนขึ้นสำหรับการโหลดไฟล์ภาพ (ภาพถ่าย) ในรูปแบบ .jpg, .gif, .png แต่ถ้าคุณต้องการ คุณสามารถทำการเปลี่ยนแปลงเพื่อปรับสคริปต์ PHP ให้ตรงกับความต้องการของคุณได้

สคริปต์ php ใช้การตรวจสอบสองรายการ:

  1. เนื่องจากโฮสต์จำกัดขนาดของไฟล์ที่อัปโหลด (ในขณะที่เขียนเนื้อหานี้ โฮสติ้งของฉันมีขีดจำกัดที่ 8 Mb) ดังนั้นจำเป็นต้องตรวจสอบขนาดสูงสุด
  2. การตรวจสอบนามสกุลไฟล์จะทำให้คุณสามารถแยกไฟล์ที่ไม่จำเป็นออกก่อนที่จะดาวน์โหลด

ฉันหวังว่าจะมีคำอธิบายเพียงพอในโค้ดฟังก์ชันเพื่อทำความเข้าใจวิธีอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ แต่ถ้าคุณมีคำถามใด ๆ ฉันยินดีที่จะตอบในความคิดเห็น

ตอนนี้เรามาพูดถึงวิธีการใช้งานจริงกัน

เราวางโค้ด PHP ของฟังก์ชันไว้ในไฟล์แยกต่างหาก: function.php และวางไว้บนเซิร์ฟเวอร์ในไดเร็กทอรีราก

และเราจะสร้างไฟล์ html ซึ่งเราจะวางแบบฟอร์มสำหรับการอัพโหลดรูปภาพ: index.html

upload.php - ไฟล์ตัวจัดการแบบฟอร์ม
name="button" - ชื่อของปุ่มเมื่อคลิกฟังก์ชั่นการอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์จะถูกเปิดใช้งาน

การอัพโหลดหลายไฟล์

ตอนนี้เรามาดูกรณีนี้เมื่อคุณต้องการอัปโหลดหลายไฟล์ไปยังเซิร์ฟเวอร์พร้อมกัน
ในการดำเนินการนี้ เราจำเป็นต้องทำการเปลี่ยนแปลงบางอย่างในไฟล์ function.php upload.php และ index.html





บางทีนี่อาจเป็นทั้งหมดที่คุณต้องใช้บริการเพื่ออัปโหลดไฟล์ผู้ใช้ไปยังเซิร์ฟเวอร์ (โฮสติ้ง)

อีกฟังก์ชันหนึ่งที่เกี่ยวข้องอย่างใกล้ชิดกับการโหลดไฟล์กราฟิก (ภาพถ่าย) คือฟังก์ชันสำหรับปรับขนาดรูปภาพ: