2020年9月21日 星期一

即時預覽圖片、多檔上傳 (with no bootstrap, no JQuery)


程式碼

<!DOCTYPE html>

<html lang=zh-Hant>

<head>

<title>preview picture with no bootstrap no jQuery</title>

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

<style>  

#OriginInput{

border:1px solid red;

height:30px;  

opacity:100; /* 必須為 0,覆蓋的「綠色圖片按鈕」才有作用 */

  width:90px;

        cursor:pointer;


}  

    #click_me{/*這是圖片,來當覆蓋按鈕*/

    margin-top:0px;

    margin-left:-60px;

        opacity:100; /* 0:不顯示 */

        /* cursor:pointer; 没作用,被 #OriginInput 強制取代 */

    }


</style>  

<body>

(1) 三種方式取得上傳圖片資料:二進位碼字串、UTF-8字串、Base64編碼字串。<br />

    (2) 上傳圖檔絕對路徑不正確,基本是瀏覽器之安全設定問題<br />

    (3) 綠色圖片游標變手型時,點按可上傳圖檔 但CSS要先設定 OriginInput.opacity = 0<br />

    (4) 預覽圖片可依需求動態調整大小<br />

    (5) 本程式已有多檔上傳功能,略改寫就能達到<br />

    <br />

    

    <div id="result" style="border:1px solid red;">測試結果區</div>

<form action="後台程式名.php" method="post" enctype="multipart/form-data">

<input id="PretendInput" type="text" readonly >

<input id="OriginInput" type="file"  multiple accept="image/gif, image/jpeg, image/png"  onchange="setFilePath()" >

<img id="click_me" src="https://via.placeholder.com/100x35/00FF00/" ><br />

</form>

</body>

<script>

function setFilePath(){


//--- 取得單一檔案路徑 + 檔名 - 第1種正確 => 

        var oOriginInput=document.getElementById("OriginInput");

        var oFiles=document.getElementById("OriginInput").files[0];

        if(oFiles && oFiles.name.trim().length > 4){

            let reader = new FileReader();


/*

            //-- 開始:用二進位字串顯示圖片資料 (讀出圖片16進位資料)

reader.readAsBinaryString(oFiles);

reader.onload = function(e) {

let vData = e.target.result;

                document.getElementById("result").innerHTML = null;

document.getElementById("result").innerHTML = vData;

};

            //-- 結束

*/

/*

            //-- 開始:用UTF-8字串顯示圖片資料 (讀出圖片16進位資料,呈現很多都無字型碼)

reader.readAsText(oFiles,'UTF-8');

reader.onload = function (e) {

let vData = e.target.result;

                document.getElementById("result").innerHTML = null;

document.getElementById("result").innerHTML = vData;

};

            //-- 結束

*/


            //-- 開始:解譯Base64編碼,直接預覽圖片 (讀出圖片16進位資料)

            reader.readAsDataURL(oFiles);

            reader.onload = function (e) {

                let vData = e.target.result;

                

                //let vData = document.getElementById("OriginInput").result; <= 錯誤語法

                //說明:(1) e.target == document.getElementById("OriginInput"), 但是 input

                //         没有 result 屬性。

                //     (2) 判斷 e.target 應該是最早取得結果值的物件,而 OriginInput 則是較後期才

                //         取得上傳的資料(或由e.target 把部份值塞給 OriginInput 的屬性變數)。

                

                //塞入完整「檔案路徑 + 檔名」

                document.getElementById("PretendInput").value=oOriginInput.value;

                            

                //預覽檔名

                document.getElementById("result").innerHTML =null;

                document.getElementById("result").innerHTML =oFiles.name + " <br /> ";

                

                //預覽圖片 (以下這段程式中的 vData 資料不是字串,是base64之圖片編碼)

                document.getElementById("result").innerHTML += "<img src='" + vData + "' style='width:120px;height:120px;'  alt='" + oFiles.name + "' />";

            };         

        //-- 結束


        }else{

        document.getElementById("PretendInput").value="";

        }



    

/*

        //--- 第2種 -- 取得單一「檔案路徑 + 檔名」之結果不正確 => C:\fakepath\sa.png

        var oFilePath=document.getElementById("OriginInput");       

        if(oFilePath.value.trim().length > 0){

document.getElementById("PretendInput").value=oFilePath.value;

alert("取得檔案路徑及檔名:" + oFilePath.value);

        }else{

        document.getElementById("PretendInput").value="";

        }

*/        


/*

        //--- 取得檔案名稱(適合多檔上傳架構)

        var oFiles=document.getElementById("OriginInput").files;

        var j=oFiles.length;

//console.log("共 " + j + " 個檔名");


        for(let i=0;i<j;i++){

if (oFiles[i]){

//alert("取得第 " + parseInt(i+1) + " 個檔名:" + oFiles[i].name.trim());

                

//以下三個有反應

console.log("取得第 " + parseInt(i+1) + " 個 name:" + oFiles[i].name.trim());

console.log("取得第 " + parseInt(i+1) + " 個 type:" + oFiles[i].type.trim());

console.log("取得第 " + parseInt(i+1) + " 個 size:" + oFiles[i].size);

                

//以下二個 undefined                

console.log("取得第 " + parseInt(i+1) + " 個 tmp_name:" + oFiles[i].tmp_name);

console.log("取得第 " + parseInt(i+1) + " 個 error:" + oFiles[i].error);

}

}

*/


/*

        //--- 取得檔案名稱(適合單檔上傳架構)

        var oFiles=document.getElementById("OriginInput").files;

        

//if(oFiles && oFiles.length>0 && sFileName.length > 0){

        if(oFiles){

        let sFileName=oFiles[0].name.trim();

        document.getElementById("PretendInput").value=sFileName;

        alert("取得檔案名稱:" + sFileName);

        }else{//清空檔名

        document.getElementById("PretendInput").value="";

        }

*/

}  

</script>

</html>