我們還可以做一些其他的處理,例如顯示預覽圖。但如果不想壓縮圖片的話,那很可能沒什麼用。我們將採用Ajax透過HTTP 的post方式上傳圖片資料。下面的例子是使用Dojo框架來完成請求的,當然你也可以採用其他的Ajax技術來實現.
OK,搞定!你還需要做的,就是創建一個只管的使用者介面,並允許你控制圖片的大小。上傳到伺服器端的數據,並不需要處理enctype為multi-part/form-data 的情況,僅僅一個簡單的POST表單處理程序就可以了. 程式碼如下:
字串路徑= request.getContextPath() ;
String basePath = request.getScheme() "://" request.getServerName() ":" request.getServerPort() 路徑"/";
%>
透過Canvas及File API縮放並上傳圖片 //參數,最大高度
var MAX_HEIGHT = 100 ;
// 渲染
function render(src){
// 建立一個Image 物件
var image = new Image();
// 綁定載入事件處理器,載入完成後來執行
image.onload = function(){
// 取得canvas DOM 物件
var canvas = document.getElementById("myCanvas") ;
// 如果高度超標
if( image.height > MAX_HEIGHT) {
// 寬度等縮放*=
image.width *= MAX_HEIGHT / image.height;
image.height = MAX_HEIGHT;
}
image.height = MAX_HEIGHT;
}
}
/取得canvas的2d環境對象,
//可以理解Context是管理員,canvas是房子
var ctx = canvas.getContext("2d");
// canvas 清屏
ctx.clearRect (0, 0, canvas.width, canvas.height);
//重設canvas寬高
canvas.width = image.width;
canvas.height = image.height;
/ / 將影像強度到canvas上
ctx.drawImage(image, 0, 0, image.width, image.height);
//!!! 請注意,圖片未加入 dom
};
};
// 設定src 屬性,瀏覽器會自動載入。
// 記住必須先綁定事件,才能設定 src 屬性,否則會出同步問題。
image.src = src;
};
// 載入圖片檔案(url路徑)
function loadImage(src){
//過濾掉非映像類型的檔案
if(!src.type.match(/image.*/ )){
if(window.console){
console.log("選取的檔案類型不是圖片: ", src.type);
} else {
window.confirm("只能選擇圖片檔案");
}
回傳;
}
// 建立FileReader 物件並呼叫render 函數來完成渲染。
var reader = new FileReader();
// 結合load事件自動回呼函數
reader.onload = function(e){
//呼叫前面的render函數
render( e.target.result);
};
//讀取檔案內容
reader.readAsDataURL(src);
};
// 上傳圖片,jQuery 版
function sendImage(){
// 取得canvas DOM 物件
var canvas = document.getElementById("myCanvas");
//取得Base64編碼後的圖片數據,格式為字串
// "data:image/png;base64,"開頭,需要在客戶端或伺服器端將其前面,後面的部分可以直接
var dataurl = canvas.toDataURL("image/png"); 寫入檔案。
// 為安全對URI進行編碼
// data:image/png;base64, 底層
var imagedata =encodeURIComponent(dataurl);
//var url = $("#form" ).attr("action");
// 1.如果表單表單不好處理,可以使用某個隱藏域來設定請求位址
//
>
var url = $("input[name='action']").val();
// 2. 也可以直接用某個dom物件的屬性來取得
//
// var url = $("#imageaction").attr("action");
//因為是字串,所以伺服器需要對資料進行轉碼,寫檔案操作等。
// 個人約定,所有http名稱參數全部小寫
console.log(dataurl);
//console.log(imagedata);
var data = {
imagename: "myImage .png",
imagedata: imagedata
};
jQuery.ajax( {
url : url,
data : data,
type : "POST",
data : data,
type : "POST",
/ /期待的回傳值類型
dataType: "json",
完整:function(xhr,result) {
//console.log(xhr.responseText);
var $tip2 = $( "#tip2");
if(!xhr){
$tip2.text('網路連線失敗!');
return false;}
var text = xhr.responseText;
if(!text){
$tip2 .text('網路錯誤!');
回傳false
}
var json = eval("(" text ")");
if(!json){
$ tip2.text('解析錯誤!');
return false
} else {
$tip2.text(json.message);
/ /console.dir(json );
//console.log(xhr.responseText)
}
}); }; function init(){ //獲取DOM元素物件var target = document.getElementById("drop-target");
// 阻止dragover(拖曳到DOM元素上方) 事件傳遞
target.addEventListener("dragover", function(e){e.preventDefault( );}, true);
// 拖曳並放開滑鼠的事件
target.addEventListener("drop", function(e){
// 阻止預設事件,以及事件傳播
e.preventDefault();
// 呼叫前面的載入影像函數,參數為dataTransfer物件的第一個檔案
loadImage(e.dataTransfer.files[0]);
}, true) ;
var setheight = document.getElementById("setheight");
var maxheight = document.getElementById("maxheight");
setheight.addEventListener("click", function(e){
//
var value = maxheight.value;
if(/^d $/.test(value)){
MAX_HEIGHT = parseInt(value);
}
e.preventDefault( );
},true);
var btnsend = document.getElementById("btnsend");
btnsend.addEventListener("click", function(e){
//
sendImage ();
},true);
};
window.addEventListener("DOMContentLoaded", function() {
//
init();
},false) ;