jQuery – JavaScript – 教你如何製作圖片上傳前的預覽圖

* 如果您想要用套件可以來這篇 (2017/03/07更新)

 

目標

  1. 讓使用者在上傳圖片前先顯示在頁面,用來確定是不是要上傳的圖片。
  2. 透過前端技術完成,不使用網路傳輸到伺服器做縮圖後回傳到前端。

解決方法

使用 Web APIs 的 FileReader (檔案讀取器) 來達到。關於 FileReader 的用法,可參考說明

線上測試

HTML

<form>
    <input type='file' class="upl">
    <div>
        <img class="preview" style="max-width: 150px; max-height: 150px;">
        <div class="size"></div>
    </div>
</form>

JavaScript/jQuery

$(function (){

    function format_float(num, pos)
    {
        var size = Math.pow(10, pos);
        return Math.round(num * size) / size;
    }

    function preview(input) {

        if (input.files && input.files[0]) {
            var reader = new FileReader();
            
            reader.onload = function (e) {
                $('.preview').attr('src', e.target.result);
                var KB = format_float(e.total / 1024, 2);
                $('.size').text("檔案大小:" + KB + " KB");
            }

            reader.readAsDataURL(input.files[0]);
        }
    }

    $("body").on("change", ".upl", function (){
        preview(this);
    })
    
})

解說

當 input.upl[type=file] 發生改變的時候會觸發我們自訂的 preview 方法。

$("body").on("change", ".upl", function (){
    preview(this);
})

我們看 preview 方法怎麼寫

/**
 * 預覽圖
 * @param   input 輸入 input[type=file] 的 this
 */
function preview(input) {

    // 若有選取檔案
    if (input.files && input.files[0]) {

        // 建立一個物件,使用 Web APIs 的檔案讀取器(FileReader 物件) 來讀取使用者選取電腦中的檔案
        var reader = new FileReader();

        // 事先定義好,當讀取成功後會觸發的事情
        reader.onload = function (e) {
            
            console.log(e);

            // 這裡看到的 e.target.result 物件,是使用者的檔案被 FileReader 轉換成 base64 的字串格式,
            // 在這裡我們選取圖檔,所以轉換出來的,會是如 『data:image/jpeg;base64,.....』這樣的字串樣式。
            // 我們用它當作圖片路徑就對了。
            $('.preview').attr('src', e.target.result);

            // 檔案大小,把 Bytes 轉換為 KB
            var KB = format_float(e.total / 1024, 2);
            $('.size').text("檔案大小:" + KB + " KB");
        }

        // 因為上面定義好讀取成功的事情,所以這裡可以放心讀取檔案
        reader.readAsDataURL(input.files[0]);
    }
}

其中要顯示的檔案大小,會須要做運算的轉換,我們額外包了一個 format_float 的方法

/**
 * 格式化
 * @param   num 要轉換的數字
 * @param   pos 指定小數第幾位做四捨五入
 */
function format_float(num, pos)
{
    var size = Math.pow(10, pos);
    return Math.round(num * size) / size;
}

如果須要多圖預覽,請參考進階的 下一篇文章

這邊的範例比較簡單,只能做一張圖片的預覽。

參考

php – 在屬性 src 使用 data url 的寫法

php 使用data url 的function :

function data_url($file, $mime)
{
$contents = file_get_contents($file);
$base64 = base64_encode($contents);
return ('data:' . $mime . ';base64,' . $base64);
}

使用Codeigniter,在Controller 裡面的function 可以這樣寫:
public function dataurl()
{
$this->load->helper('file');
$base64 = base64_encode(read_file(你的圖片實際位置));
return $url = 'data:jpg;base64,' . $base64; //我這邊圖片類型直接寫jpg,就不寫判斷了
}

可參考:
http://www.player.idv.tw/prog/index.php/Data_URI_scheme#PHP
http://blog.darkthread.net/post-2010-11-05-data-uri.aspx

 

jQuery – TinyMCE 網址轉換設定

TinyMCE 對於同 domain 以 http 開頭的絕對網址,預設會雞婆地作 url 相對路徑的轉換
TinyMCE 提供 3 + 1 組選項設定,可供自由運用組合。

當 convert_urls 為 true 時 (預設值),底下 3 組可交互使用
relative_urls 布林值,預設為 true
remove_script_host 布林值,預設為 true
document_base_url 字串值,預設為當前程式的路徑
或單獨將 convert_urls 設定為 false 關閉網址轉換

參考:Paths/URLs are incorrect, I want absolute/relative URLs?
http://tinymce.moxiecode.com/wiki.php/TinyMCE_FAQ#Paths.2FURLs_are_incorrect.2C_I_want_absolute.2Frelative_URLs.3F

參考:URL conversion
http://tinymce.moxiecode.com/tryit/url_conversion.php

<script type="text/javascript">
// 對於同 domain 的網址或圖片連結,會以根目錄 / 作為開頭
// TinyMCE with absolute URLs on links and images
tinyMCE.init({
	relative_urls: false
});

// 對於同 domain 的網址或圖片連結,以完整 http 絕對網址開頭
// TinyMCE with absolute URLs and including domain on links and images
tinyMCE.init({
	relative_urls: false,
	remove_script_host: false
});

// 此為預設值:自動轉換同 domain 的網址或圖片連結,為相對於當前程式的路徑
// TinyMCE with relative URLs on links and images
tinyMCE.init({
	relative_urls: true // Default value
});

// 以指定好的 base url 為基礎相對位置,自動轉換同 domain 的網址或圖片連結
// TinyMCE with relative URLs on links and images to a specific page
tinyMCE.init({
	relative_urls: true, // Default value
	document_base_url: 'http://tinymce.moxiecode.com/'
});

// 不作任何 url 轉換
// TinyMCE with no url convertion
tinyMCE.init({
	convert_urls: false
});
</script>

 

 

 

轉自:http://www.doubleservice.com/2011/02/tinymce-convert-urls/

jquery – masonry瀑布流,並使用imagesLoaded 避免覆蓋圖片

現在改版後的masonry說明的清楚多了
http://masonry.desandro.com/appendix.html

目前我介紹的版本是 v3.1.2

官方說明滿清楚的,我這邊使用jQuery介紹

下載http://desandro.github.io/imagesloaded/imagesloaded.pkgd.min.js 並插入到你的網頁中
插入以下範例


<style>
.item { width: 25%; border:1px solid black; }
.item.w2 { width: 50%; }
</style>
<script type="text/javascript" src="imagesloaded.pkgd.min.js"></script>

<script>
$(function (){
	var $container = $('#container');

	//當圖片讀取完畢才執行
	$container.imagesLoaded(function (){

		// initialize
		$container.masonry({
			columnWidth: 100,
			itemSelector: '.item',

		})

	});
});
</script>
<div id="container">
    <div class="item">A</div>
    <div class="item w2">B</div>
    <div class="item">C</div>
</div>

主要重點在於使用imagesLoaded,
可以當圖片下載完畢後,才執行masonry渲染,確保DIV不會被圖片覆蓋。
可參考說明:http://masonry.desandro.com/appendix.html
裡面有外掛 imagesLoaded 的載點~