การ Upload ไฟล์ เปลี่ยนมาใช้ฟังค์ชั่น move_upload_file แทน copy ดีกว่าครับ
ผมว่า move_upload_file() ก็มีข้อเสีย มันต้องดึง temp จาก server สู่ไดเรททรอรีเป้าหมายใน server
ส่วน copy() มันดึงจาก temp จากเครื่องเรา สู่ไดเรททอรรีเป้าหมายใน server
ผมเข้าใจผิดป่ะครับ ผิดก็โทษที่นะครับ
http://community.thaiware.com/index.php?showtopic=327170
อันนี้อีกข้อมูลหนึ่งที่เขาอธิบายให้ฟังอีก
Date :
2009-10-15 18:45:33
By :
xbeginner01
ผมคิดว่าไม่นะครับ (ยังไม่ได้อ่าน)
แต่ผมคิดว่า มันดึงจาก temp ใน server เหมือนกันแหละครับ
Date :
2009-10-15 18:49:11
By :
pjgunner
คห. แรก
เออ น่าจะเข้าใจผิดนะครับ
ไฟล์ที่อัพโหลดจะถูกเก็บไว้ใน เครื่อง Server นะ
จะเก็บใน temp เครื่องเราทำไมอา -*-
Date :
2009-10-15 19:12:31
By :
danya
อัพโหลดยังไงก็เข้า temp บน server อยู่แ้ล้วครับ
อยู่ที่ว่า php.ini มันจะ set ไว้ตรงไหนของ server ถ้าไม่ set มันจะอยู่ที่ default ของเครื่อง
ไม่มีหรอกมาดูดจาก temp เครื่องเรา เพราะมันทำงานฝั่งเซอเวอร์ครับ อัพโหลดทีมันก็สร้าง temp ไว้ นามสกุล .tmp มั้ง
ดังนั้นสองคำสั่งนี้ ต่างกันที่ move กับ copy ครับ
ปล. ผมไม่เคยใช้ copy ตั้งแต่หัดครั้งแรกละ เพราะใ้ช้แล้วมัน error ก็เลย หันมาใช้ move_upload แทน เหอะๆ error ครั้งเดียวก็เข็ดละ แป๋ววว...
ปล. 2 ทำไมอยู่ดีๆ ดุนมารณรงค์ซะงั้น
Date :
2009-10-15 19:25:52
By :
plakrim
ปล.3 เพราะว่า ตามเว็บไทย ผมเห็นเวลาโค้ดอัพโหลดแล้ว จะชอบใช้ copy กันจัง
ต่างจากค้นหาจาก Google จะไม่มีใครใช้ copy จะใช้แต่ mode_upload_file
Date :
2009-10-15 20:36:56
By :
danya
move_upload_file <<< ทำไมใช้ไม่ได้อะครับหรือว่าเขียนให้ดูเฉยๆ
ที่ใช้เป็นอันนี้รึป่าวครับ move_uploaded_file เห็นอยู่ตรง โพสที่ 3
Date :
2009-10-16 00:38:24
By :
hamzter
เขียนย่อๆ อะ 5555+
Date :
2009-10-17 16:26:02
By :
danya
แล้วมันใช้งานยังไงคับ ผมอยากทำเป็นบ้าง ตอนนี้ ใช้ copy แล้วมัน error นะคับ แบบนี้นะคับ
Warning: copy(photo/29.gif) [function.copy]: failed to open stream: Permission denied in D:\inetpub\vhosts\hattakam.com\httpdocs\admin_product_edit2.php on line 174
ไม่รู้ว่ามันเป็นเพราะอะไร พี่ ๆ ช่วยผมหน่อยได้ไหมคับ ขอบคุณคับ
Date :
2010-10-19 09:11:33
By :
เด้กฝึกหัด
ถ้ามันไม่ลบเราก็ลบให้มันสิครับ unlink(file); อ่ะ
Date :
2010-10-19 09:20:55
By :
manosate
ผมใช้ script นี้คับ ... ผมทำในเครื่อง server จำลอง มันก็สามารถ เพิ่ม ลบ แก้ไข้ รูปภาพได้นะคับ แต่ ผมเอาลง sever จริง ๆ แล้ว
มันขึ้น error นะคับ Warning: copy(photo/29.gif) [function.copy]: failed to open stream: Permission denied in D:\inetpub\vhosts\hattakam.com\httpdocs\admin_product_edit2.php on line 174
..................................................................................................................................................................................
<?
$chkdel=$_POST[chkdel];
$id_edit=$_POST[id_edit];
$name=$_POST[name];
$ref_id_type=$_POST[ref_id_type];
$detail=$_POST[detail];
$price=$_POST[price];
$photo=$_POST[photo];
$fileupload=$_FILES['fileupload'] ['tmp_name'];
$fileupload_name=$_FILES['fileupload'] ['name'];
$fileupload_size=$_FILES['fileupload'] ['size'];
$fileupload_type=$_FILES['fileupload'] ['type'];
include "connect.php";
if ($chkdel=="1") {
$sql3="update tb_product set photo_prd=' ' where id_prd ='$id_edit' ";
$result3=mysql_db_query($dbname,$sql3);
unlink ("photo/$photo_del");
}
if ($fileupload) {
$array_last=explode(".",$fileupload_name);
$c=count ($array_last) - 1;
$lastname=strtolower($array_last[$c]);
if ($lastname=="gif" or $lastname=="jpg" or $lastname=="jpeg"){
$photoname=$id_edit.".".$lastname;
copy ($fileupload,"photo/".$photoname);
$sql3="update tb_product set photo_prd='$photoname' where id_prd ='$id_edit' ";
$result3=mysql_db_query($dbname,$sql3);
}
unlink ($fileupload);
}
$sql="update tb_product set
name_prd='$name',ref_id_type='$ref_id_type',detail_prd='$detail',price_prd='$price' where id_prd='$id_edit' ";
$result=mysql_db_query($dbname,$sql);
if ($result) {
echo "<h3> แก้ไข สินค้าเรียบร้อยแล้ว </h3>";
echo " [ <a href=admin_product.php>กลับหน้าหลัก </a> ]";
} else {
echo " <h3> ERROR : ไม่สามารถแก้ไขสินค้าได้ </h3>";
}
mysql_close();
?>
Date :
2010-10-19 09:25:31
By :
เด้กฝึกหัด
มานติดเรือ่ง Permission อยู่้ครับ เวลาที่คุณจะ upload คุณต้อง ปรับ Permission ก่อนครับ ลองดูครับ
Date :
2010-10-19 09:28:03
By :
SOUL
ปกติใช้แต่ copy ครับ แต่ถ้าให้ดีใช้การ move ดีกว่าครับ
Date :
2010-10-19 09:33:46
By :
webmaster
คือว่า ผมต้อง Permission ยังไงคับ แล้ว เปลียน ไฟล์ไหนคับ ช่วยผมที ผมทำยังไม่ได้คับ
Date :
2010-10-19 10:11:56
By :
เด้กฝึกหัด
หรือว่ามีวิธีไหนที่ง่ายกว่านี้ช่วยบอกผมทีคับ
Date :
2010-10-19 10:13:02
By :
เด้กฝึกหัด
ใช้ move_uploaded_file เท่านั้นครับ copy เสี่ยงต่อการถูก hack แต่จริงๆ คนมักจะ hack เพราะไม่ได้ตรวจนามสกุลไฟล์ที่ upload มากกว่า.. -*-
Date :
2010-10-19 10:15:08
By :
...
พี่ ๆ ช่วย ยกตัวอย่างการใช้งานให้หน่อยคับ หรือ ไม่ก็ script ตัวอย่าง พอที่จะให้ผม มีแนวทาง การใช้งาน หน่อยคับ ผมไม่รู้ว่า move_upload_file มันใช้งานยังไงคับ ขอบคุณคับ
Date :
2010-10-19 10:18:27
By :
เด้กฝึกหัด
ผมทำได้แล้วคับ ขอบคุณมากคับสำหรับ คำตอบของพี่ ๆทุกคน ผมไปปรับ permission ก็เลยสามารถ upload รูปได้แล้ว ดีใจมากมายเลย
([ 0_0])
Date :
2010-10-19 10:52:36
By :
เด้กฝึกหัด
ใช้ copy ก็ได้ครับ ดีกว่า เพียงแต่ว่า ถ้ามีชื่อไพล์ซ้ำกันมันก็จะแก้ไข ไพล์นั้นเลย เราควรเช็คชื่อไพล์ ถ้าชื่อซ้ำก็ให้ใส่อะไรเข้าไปในชื่อไพล์เพื่อให้ชื่อมันไม่ซ้ำกัน ก็แค่นี้ครับ
ตัวอย่างการ ลบ ชื่อไพล์ฐานข้อมูล ในไพล์ข้อมูลในฐานข้อมูล
$sql2 = "SELECT* from attach_doc where documents_id = '$delete'";
$dbquery2 = mysql_query($sql2);
$result2 = mysql_fetch_array($dbquery2);
$d_file1 = $result2["d_file1"];
$d_file2 = $result2["d_file2"];
$d_file3 = $result2["d_file3"];
if($d_file1 != "") {
///////////////////////////////////////////////////////////// unlink คือการ ลบไพล์ข้อมูลใน host
unlink("d_file1/$d_file1");
} elseif($d_file2 != "") {
unlink("d_file2/$d_file2");
} if($d_file3 != "") {
unlink("d_file3/$d_file3");
}
///////////////////////////////////////////////////////////////////////// การลบข้อมูลในฐานข้อมูล
$strSQL = "DELETE FROM attach_doc ";
$strSQL .="WHERE documents_id = '$delete'";
$objQuery = mysql_query($strSQL);
////////////////////////////
$file1 = $_FILES["d_file1"]["name"]; /////// การชื่อไพล์
if($file1 != "") {
$sqlf = "SELECT* from attach_doc WHERE d_file1 = '$file1'"; ///////////// หาในฐานข้อมูลว่ามีชื่อไพล์ซ้ำกันมั้ย
$dbqueryf = mysql_query($sqlf);
$resultf = mysql_fetch_array($dbqueryf);
if ($resultf) {
$file1 = $re2._.$file1; ///////////////// ถ้าซ้ำให้ใส่ เวลาข้างหน้าไพล์ เพิ่มเป็นชื่อไพล์อีก
}
}
//////////////////////
copy($data_file1,"d_file1/".$file1); ////////// นี้ไง copy ไพล์หนะ
copy($data_file2,"d_file2/".$file2);
copy($data_file3,"d_file3/".$file3);
////////////////// add ชื่อไพล์เข้าสู่ฐานข้อมูล
$strSQL = "INSERT INTO attach_doc";
$strSQL .="(d_file1, d_file2, d_file3, documents_id) VALUES ('".$file1."', '".$file2."', '".$file3."', '$report2')";
///////////
ลองไปปรับ ใช้ดูนะครับ มีข้อส่งสัย
[email protected]
Date :
2010-10-29 21:13:49
By :
manersci
move_uploaded_file ช่วยเรื่อง security ได้นะครับ
Date :
2010-10-30 17:23:01
By :
unknowszaa
คำสั่ง move กับ copy ต่างกันตรงไหน มีคำตอบมาให้ครับ
คำสั่ง move
เมื่อเราใช้ temp จะหายทันทีหลัง อัพเสร็จ ข้อดี คือ ประหยัด temp (ram) ข้อเสียเรียกใช้เพียงครั้งเดียว ถ้าไฟตกหรือด้วยเหตุไดๆ temp เสีย ไฟล์ที่อัพไปจะไม่สมบรูณ์ cpu จะไม่มีการตรวจเช็คว่า สมบูรณ์ แต่เช็คแค่ว่า อัพผ่าน แค่นั้น
คำสั่ง copy
เมื่อใช้คำสั่งแล้ว temp จะยังอยู่ สามารถเรียกใช้งานได้เรื่อยๆ past ได้เรื่องๆจาก temp เดิม ถ้ามีการเรียกใช้งานtempเดิมบ่อยๆ แนะนำให้ copy cpuตรจสอบ ข้อมูลเทียบ ได้ ข้อเสีย ต้อง Destroy หรือ unlink ทุกครั้ง หลังทำเสร็จ ไม่งั้น temp ค้าง สามารถโดย hack copy tempไปใช้ประโยชน์อื่นได้ และทำให้เครืองทำงานหนัก
แต่** ถ้าเป็นการ up to sever แล้วจาก ทีหนึ่งไปอีกที่ 1 ไป อีกที 1 temp จะอยู่บน server จะหายไปเอง ตามระยะเวลา ที่ php ini ได้ตั้งไว้ และ temp ในการเรียก ในเครื่องเราจะหายไปตอน เรา เปลี่ยนหน้าเว็บจากหน้า a ไป b ถ้ากระทำ ในหน้า a.php ตลอดๆ ก็จะทำให้ กิน ram ในเครื่องเรามากขึ้นในกรณี copy รัวๆ ข้อระวังใช้คำสั่ง copy อย่าเขียนโปรแกรม loop ไม่สิ้นสุด งั้นเครื่องมี ค้าง แงมๆ
Date :
2018-03-27 15:28:36
By :
วีรวิทย์
ทำโค้ดตัวอย่างมาให้ เผื่อจะเป็นประโยชน์สำหรับคนอื่นในอนาคต.
ในโค้ดมีเขียนคำอธิบายไว้ แต่ก็ควรทำความเข้าใจ เอาไปทดลองเล่นทดลองแก้ไขเพื่อให้เข้าใจด้วย เพื่อประโยชน์ของตัวเอง.
Code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload form</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<!--input type="hidden" name="MAX_FILE_SIZE" value="1"--><!-- สำหรับทดสอบเท่านั้น -->
เลือกไฟล์รูป: <input type="file" name="image-file" accept=".jpg,.jpeg,.gif,.png,.webp">
<p>
<button type="submit">Submit</button>
</p>
</form>
<p><a href="delete-all.php">ลบรูปที่อัปโหลดแล้วทั้งหมด</a>.</p>
</body>
</html>
form.html
Code (PHP)
<?php
// แสดง PHP error ทั้งหมดเพื่อหาข้อผิดพลาดขณะเขียนโค้ด.
// แม้จะกำหนดให้แสดง error หมดแล้ว แต่ถ้าไฟล์ใหญ่มากกว่าที่ server อนุญาต มันมีโอกาสที่จะแสดงหน้าขาวๆล้วนๆได้.
ini_set('display_errors', true);
ini_set('display_startup_errors', true);
error_reporting(E_ALL);
$config = [];
$config['allowFileSize'] = 1000000;// ขนาดไฟล์ที่อนุญาต หน่วยเป็นไบต์ (1000000 = 1MB).
$config['allowMimeTypes'] = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];// mime type ไฟล์ที่อนุญาต (ตัวอักษรเล็กทั้งหมดเท่านั้น).
// ส่วนประมวลผล. ==============================================================
// @link https://www.php.net/manual/en/features.file-upload.post-method.php#example-445 อ้างอิงค่า array key ทั้งหมดในตัวแปร $_FILES.
if (
isset($_FILES['image-file']['tmp_name'])
&& is_uploaded_file($_FILES['image-file']['tmp_name'])
&& isset($_FILES['image-file']['error'])
&& isset($_FILES['image-file']['size'])
) {
// ถ้ามีไฟล์อัปโหลดแล้ว.
if ($_FILES['image-file']['error'] === UPLOAD_ERR_OK) {
// ถ้าไฟล์อัปโหลดไม่มีข้อผิดพลาดเลย.
if ($_FILES['image-file']['size'] > $config['allowFileSize']) {
// ถ้าอัปโหลดไฟล์ใหญ่กว่าที่อนุญาต.
$errorMessage = 'ขนาดไฟล์ใหญ่กว่าที่อนุญาต (' . $_FILES['image-file']['size'] . ' > ' . $config['allowFileSize'] . ' ไบต์)';
} else {
// ถ้าอัปโหลดไฟล์ในขนาดไม่เกินที่อนุญาต.
// ตรวจประเภทไฟล์ (mime type).
$Finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = strtolower($Finfo->file($_FILES['image-file']['tmp_name']));
unset($Finfo);
if (!in_array($mimeType, $config['allowMimeTypes'])) {
$errorMessage = 'คุณได้อัปโหลดประเภทไฟล์ที่ไม่อนุญาต. (' . $mimeType . ')';
}
unset($mimeType);
}
} else {
// ถ้าไฟล์อัปโหลดมีข้อผิดพลาดบางอย่าง.
switch ($_FILES['image-file']['error']) {
case UPLOAD_ERR_INI_SIZE:
$errorMessage = 'ขนาดไฟล์ใหญ่เกินกว่าที่กำหนดไว้โดย <code>upload_max_filesize</code> ใน php.ini. (' . ini_get('upload_max_filesize') . ')';
break;
case UPLOAD_ERR_FORM_SIZE:
$errorMessage = 'ขนาดไฟล์ใหญ่เกินกว่าที่กำหนดไว้โดย <code>MAX_FILE_SIZE</code> ภายในแท็ก <code><form></code>.';
break;
case UPLOAD_ERR_PARTIAL:
$errorMessage = 'ไฟล์ถูกอัปโหลดแค่เป็นบางส่วน.';
break;
case UPLOAD_ERR_NO_FILE:
$errorMessage = 'คุณไม่ได้เลือกไฟล์.';
break;
case UPLOAD_ERR_NO_TMP_DIR:
$errorMessage = 'ไม่พบโฟลเดอร์ temporary.';
break;
case UPLOAD_ERR_CANT_WRITE:
$errorMessage = 'ไม่สามารถเขียนไฟล์ได้.';
break;
case UPLOAD_ERR_EXTENSION:
$errorMessage = 'ส่วนขยายของ PHP นั้นหยุดการอัปโหลดไฟล์.';
break;
default:
$errorMessage = 'มีข้อผิดพลาดที่ไม่ทราบสาเหตุ.';
break;
}// endswitch;
}// endif; $_FILES ['error'] key.
if (!isset($errorMessage)) {
// ถ้าไม่มีข้อความ error ใดๆเลย.
// ย้ายไฟล์ที่อัปโหลด มาที่โฟลเดอร์เดียวกันกับไฟล์นี้ ( __DIR__ ).
$ext = pathinfo($_FILES['image-file']['name'], PATHINFO_EXTENSION);// ext ไม่มีจุด
$newFileName = 'uploaded/' . date('YmdHis') . '.' . $ext;
unset($ext);
if (!is_dir(__DIR__ . DIRECTORY_SEPARATOR . 'uploaded')) {
// ถ้าไม่มีโฟลเดอร์ปลายทางที่จะย้ายไฟล์เข้าไป ให้สร้างเตรียมไว้.
mkdir(__DIR__ . DIRECTORY_SEPARATOR . 'uploaded');
}
if (!move_uploaded_file($_FILES['image-file']['tmp_name'], __DIR__ . DIRECTORY_SEPARATOR . $newFileName)) {
// ถ้าย้ายไม่สำเร็จ.
$errorMessage = 'ไม่สามารถย้ายไฟล์ที่อัปโหลดแล้วได้ อาจจะมีปัญหาเรื่องตำแหน่งที่ย้ายหรือการอนุญาตในระบบไฟล์.';
} else {
$success = true;
}
}
}// endif; there is an uploaded file.
// ข้างล่างนี้เป็นส่วนแสดงผล. =================================================
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload form result</title>
<style type="text/css">
code {
color: orange;
}
.error {
color: red;
font-size: 1.15rem;
}
</style>
</head>
<body>
<?php
if (isset($errorMessage)) {
// ถ้ามีข้อผิดพลาด
if (is_string($errorMessage)) {
// ถ้าข้อผิดพลาดเป็น string
echo '<p class="error">' . $errorMessage . '</p>' . PHP_EOL;
} elseif (is_iterable($errorMessage)) {
// ถ้าข้อผิดพลาดเป็นอะไรที่วนลูปได้
foreach ($errorMessage as $anErrorMsg) {
if (is_string($anErrorMsg)) {
echo '<p class="error">' . $anErrorMsg . '</p>' . PHP_EOL;
} else {
// บ้าแล้ว!! มึงจะยัด error ที่ไม่ใช่ string ไว้ใน array ทำไม? ไอ้บ้า!!!
throw new \Exception('There are some crazy error: ' . print_r($anErrorMsg, true));
exit();// prevent `try..catch`.
}
}// endforeach;
unset($anErrorMsg);
}
unset($errorMessage);
} elseif (isset($success) && true === $success) {
// ถ้าอัปโหลดสำเร็จ.
if (isset($newFileName)) {
echo '<img src="./' . $newFileName . '" alt="uploaded image">';
} else {
// ถ้าอัปโหลดสำเร็จแต่ไม่มีตัวแปรชื่อไฟล์ใหม่ (อีหยังวะ?)!!
throw new \Exception('There is no variable `$newFileName`!');
exit();// prevent `try..catch`.
}
}
unset($newFileName, $success);
?>
</body>
</html>
upload.php
สุดท้ายแถม
Code (PHP)
<?php
/**
* Recursive remove folder.
*
* @link https://stackoverflow.com/a/11614201/128761 Original source code.
* @param string $dir
* @return void
*/
function rrmdir($dir)
{
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir . "/" . $object) == "dir") {
rrmdir($dir . "/" . $object);
} else {
unlink($dir . "/" . $object);
}
}
}
reset($objects);
rmdir($dir);
}
}// rrmdir
rrmdir(__DIR__ . DIRECTORY_SEPARATOR . 'uploaded');
echo '<p>ลบสำเร็จแล้ว.</p>';
delete.php
Date :
2024-07-16 07:52:00
By :
mr.v
Load balance : Server 04