เนื้อหาในบทความนี้ เป็นแนวทาง การประยุกต์ และสร้างฟังก์ชั่นใช้งาน
ให้สะดวกมากขึ้น สามารถนำบางส่วนไปดัดแปลง ประยุกต์ต่อยอดเพิ่มเติม
เนื้อหาดัดแปลงมาจากบทความ
เทคนิค ประยุกต์ใช้ ajax ใน jQuery ร่วมกับ iframe กับการอัพโหลดรูป
https://www.ninenik.com/content.php?arti_id=306 via @ninenik
และ
javascript เรียกฟังก์ชัน ใน parent จาก iframe
https://www.ninenik.com/content.php?arti_id=305 via @ninenik
หลักการทำงาน คือ เรามีฟอร์มหนึ่ง ที่มี textbox และ input file ซึ่งเราจะให้ทำงาน
พร้อมกันทั้งการส่งค่า textbox และ อัพโหลดไฟล์ โดยที่ไม่ต้องให้มีการ เปลี่ยนไปหน้า
ใหม่หรือ reload เพจ โดยอาศัยวิธีการส่งค่าผ่าน iframe
ขอแยกสั่งที่ได้จากการประยุกต์ เราได้ฟังก์ชั่น php อย่างง่ายสำหรับอัพโหลดไฟล์
ดังนี้
<?php
// function up file
function upfile_only($file,$filelocate,$limit_size=2000000){
$allowed_types=array("doc","pdf","txt");
$error_msg="";
$status=0;
$arr_file_up=array();
if($file["name"]!=""){
$fileupload1=$file["tmp_name"];
$g_file=explode(".",$file["name"]);
$ext = strtolower(array_pop($g_file));
$file_up=time().date("Ymd").".".$ext; // กำหนดรุปแบบชื่อไฟล์
$unitFile="";
$textFileSize="";
if($limit_size>=1000000){
$textFileSize=round($limit_size/1000000, 0);
$unitFile="MB";
}elseif($limit_size>=1000){
$textFileSize=round($limit_size/1000, 0);
$unitFile="KB";
}else{
$textFileSize=round($limit_size, 0);
$unitFile="Byte";
}
// echo $textFileSize." ".$unitFile;
$canUpload=0;
if($file["size"]<=$limit_size){
$canUpload=1;
if(@in_array($ext,$allowed_types)){
$canUpload=1;
if($fileupload1!="" && $canUpload==1){
$status=1;
@move_uploaded_file($fileupload1,$filelocate.$file_up);
@chmod($filelocate.$file_up,0777);
$error_msg="";
}else{
$status=2;
$file_up="";
$error_msg="เกิดข้อผิดพลาด กรุณาลองใหม่ อีกครั้ง";
}
}else{
$status=3;
$canUpload=0;
$file_allowed_types = implode(",", $allowed_types);
$error_msg="อนุญาตอัพโหลดเฉพาะไฟล์ $file_allowed_types เท่านั้น";
}
}else{
$status=4;
$canUpload=0;
$error_msg="ขนาดไฟล์ต้องไม่เกิน $textFileSize $unitFile";
}
}else{
$status=5;
$error_msg="กรุณาเลือกไฟล์ที่ต้องการอัพโหลด";
}
$arr_file_up['error']=$error_msg;
$arr_file_up['name']=$file_up;
$arr_file_up['size']=$file["size"];
$arr_file_up['status']=$status;
return $arr_file_up; // ส่งกลับ array ข้อมูล
}
?>
การใช้งาน
// การใช้งานฟังก์ชั่น สำหรับ upfile แบบกำหนดเงื่อนไข
//$UpFile=upfile_only(ชื่อ fileupload,โฟลเดอร์ที่ต้องการเก็บ,ขนาดไฟล์ 1000=1kb);
$UpFile=upfile_only($_FILES['file_upload'],"fileplace/",500000);
// $UpFile จะรับค่า array ที่ได้จากการใช้งานฟังก์ชั่น
// เราสามารถเอาค่าที่ได้ไปตรวจสอบหรือทำงานส่วนอื่นต่อได้
// $UpFile['name'] // ชื่อไฟล์
// $UpFile['error'] // ข้อความแจ้ง ถ้าไม่มี error ค่าจะเป็นว่าง
// $UpFile['status'] // สถานะต่างๆ เป็นตัวเลข 1-5 โดย 1 คือ อัพโหลดสมบูรณ์
// $UpFile['size'] // ขนาดของไฟล์ byte
จะเห็นว่าฟังก์ชั่นการอัพโหลดไฟล์ เราสามารถกำหนดนามสกุลไฟล์ที่อนุญาตได้
กำหนดขนาดของไฟล์ที่สามารถอัพโหลดได้
ต่อไป มาดูส่วนของโค้ดเต็ม ของบทความนี้
จะมีไฟล์สองไฟล์ คือไฟล์หลัก สมมติชื่อ test_upfile_iframe.php
และไฟล์ที่ใช้ใน iframe ชื่อ upfile.php
คำอธิบาย แสดงในโค้ด
test_upfile_iframe.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
#placeupload{
width:1px;height:1px;visibility:hidden;
}
</style>
</head>
<body>
<br><br>
<div style="margin:auto;width:800px;">
<!--target="placeupload" -->
<iframe id="placeupload" name="placeupload"></iframe>
<form action="upfile.php" target="placeupload" method="post" enctype="multipart/form-data" name="form5" id="form5">
<input type="text" name="mytext" id="mytext" value="" /><br><br>
<input type="file" name="file_upload" id="file_upload" />
<input type="submit" name="bt_upload" id="bt_upload" value="Submit" />
</form>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
});
// ฟังก์ชั่นสำหรับตรวจสอบการอัพโหลดผ่าน iframe
// checkUpload(ชื่อไฟล์ที่ได้,ข้อความ error ถ้ามี,สถานะการอัพไฟล์,ขนาดไฟล์,สถานะการทำงานทั้งหมด){
function checkUpload(upfile,error,status,filesize,total_status){
if(total_status==1 && status==1 && error==""){
alert("บันทึกข้อมูลเรียบร้อยแล้ว");
$("#form5")[0].reset();
}else{
if(error!=""){
if(status==2 || status==3 || status==4 || status==5){
alert(error);
$("#file_upload").val("");
}
}
}
// alert(upfile);
// alert(error);
// alert(status);
// alert(filesize);
// alert(total_status);
}
</script>
</body>
</html>
คำอธิบาย แสดงในโค้ด
upfile.php
<?php
header("Content-type:text/html; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// เชื่อมต่อกับฐานข้อมูล
$link=mysql_connect("localhost","root","test"); // เชื่อมต่อ Server
mysql_select_db("test"); // ติดต่อฐานข้อมูล
mysql_query("set character set utf8"); // กำหนดค่า character set ที่จะใช้แสดงผล
// function up file
function upfile_only($file,$filelocate,$limit_size=2000000){
$allowed_types=array("doc","pdf","txt");
$error_msg="";
$status=0;
$arr_file_up=array();
if($file["name"]!=""){
$fileupload1=$file["tmp_name"];
$g_file=explode(".",$file["name"]);
$ext = strtolower(array_pop($g_file));
$file_up=time().date("Ymd").".".$ext; // กำหนดรุปแบบชื่อไฟล์
$unitFile="";
$textFileSize="";
if($limit_size>=1000000){
$textFileSize=round($limit_size/1000000, 0);
$unitFile="MB";
}elseif($limit_size>=1000){
$textFileSize=round($limit_size/1000, 0);
$unitFile="KB";
}else{
$textFileSize=round($limit_size, 0);
$unitFile="Byte";
}
// echo $textFileSize." ".$unitFile;
$canUpload=0;
if($file["size"]<=$limit_size){
$canUpload=1;
if(@in_array($ext,$allowed_types)){
$canUpload=1;
if($fileupload1!="" && $canUpload==1){
$status=1;
@move_uploaded_file($fileupload1,$filelocate.$file_up);
@chmod($filelocate.$file_up,0777);
$error_msg="";
}else{
$status=2;
$file_up="";
$error_msg="เกิดข้อผิดพลาด กรุณาลองใหม่ อีกครั้ง";
}
}else{
$status=3;
$canUpload=0;
$file_allowed_types = implode(",", $allowed_types);
$error_msg="อนุญาตอัพโหลดเฉพาะไฟล์ $file_allowed_types เท่านั้น";
}
}else{
$status=4;
$canUpload=0;
$error_msg="ขนาดไฟล์ต้องไม่เกิน $textFileSize $unitFile";
}
}else{
$status=5;
$error_msg="กรุณาเลือกไฟล์ที่ต้องการอัพโหลด";
}
$arr_file_up['error']=$error_msg;
$arr_file_up['name']=$file_up;
$arr_file_up['size']=$file["size"];
$arr_file_up['status']=$status;
return $arr_file_up; // ส่งกลับ array ข้อมูล
}
///////////////////
if(isset($_POST['bt_upload'])){
// การใช้งานฟังก์ชั่น สำหรับ upfile แบบกำหนดเงื่อนไข
//$UpFile=upfile_only(ชื่อ fileupload,โฟลเดอร์ที่ต้องการเก็บ,ขนาดไฟล์ 1000=1kb);
$UpFile=upfile_only($_FILES['file_upload'],"fileplace/",500000);
// $UpFile จะรับค่า array ที่ได้จากการใช้งานฟังก์ชั่น
// เราสามารถเอาค่าที่ได้ไปตรวจสอบหรือทำงานส่วนอื่นต่อได้
// $UpFile['name'] // ชื่อไฟล์
// $UpFile['error'] // ข้อความแจ้ง ถ้าไม่มี error ค่าจะเป็นว่าง
// $UpFile['status'] // สถานะต่างๆ เป็นตัวเลข 1-5 โดย 1 คือ อัพโหลดสมบูรณ์
// $UpFile['size'] // ขนาดของไฟล์ byte
// echo "<pre>";
// print_r($UpFile);
// echo "</pre>";
$total_status=0;
// ถ้าอัพเดทข้อมูลอื่นๆ เช่น เพิ่มข้อมูลลงฐานข้อมูลสำเร็จให้กำหนดค่า
// $total_status=1;
if($UpFile['status']==1){ // ถ้าอัพไฟล์สำเร็จ
// ทำงานคำสั่งอื่น เช่น การบันทึกลงฐานข้อมูล
$total_status=1;
}
?>
<script type="text/javascript">
// ส่งค่ากลับไปที่ เพจหลัก
parent.checkUpload('<?=$UpFile['name']?>'
,'<?=$UpFile['error']?>'
,'<?=$UpFile['status']?>'
,'<?=$UpFile['size']?>'
,'<?=$total_status?>');
</script>
<?php
}
?>