2016-01-14 / JSN / 14 Comments / 20,970 次瀏覽
目標
- 讓使用者在上傳圖片前先顯示在頁面,用來確定是不是要上傳的圖片。
- 透過前端技術完成,不使用網路傳輸到伺服器做縮圖後回傳到前端。
解決方法
使用 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;
}
如果須要多圖預覽,請參考進階的 下一篇文章。
這邊的範例比較簡單,只能做一張圖片的預覽。
參考
2013-09-22 / JSN / 0 Comments / 144 次瀏覽
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
2013-09-16 / JSN / 0 Comments / 127 次瀏覽
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/
2013-08-27 / JSN / 0 Comments / 2,613 次瀏覽
現在改版後的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 的載點~