用MVC上传图片以及载图功能.docx
《用MVC上传图片以及载图功能.docx》由会员分享,可在线阅读,更多相关《用MVC上传图片以及载图功能.docx(24页珍藏版)》请在冰点文库上搜索。
用MVC上传图片以及载图功能
上
除了ID是uniqueidentifier,姓名跟照片都是nvarchar,性別是bit
有關MVC的新增修改刪除,以及架構就不重講啦,直接看專案架構吧
Index的地方,將資料撈出來做List,一開始因為還有任何資料所以長下面這樣
01
02
03
04
05
06
07
08
<%foreach(variteminModel){%>
09
10
11
<%=Html.ActionLink("Edit","Edit",new{id=item.ID})%>|
12
<%=Html.ActionLink("Delete","Delete",new{id=item.ID})%>
13
14
15
16
100px;height:
100px;"/>
17
18
<%}%>
19
20
<%=Html.ActionLink("新增一筆資料","Create")%>
注意一下第16行,圖片的路徑,以及我有固定圖片的寬高
再來開始寫新增的程式碼及View
<%using(Html.BeginForm()){%>
Fields
<%=Html.LabelFor(model=>model.姓名)%>
<%=Html.TextBoxFor(model=>model.姓名)%>
<%=Html.ValidationMessageFor(model=>model.姓名)%>
<%=Html.LabelFor(model=>model.性別)%>
<%=Html.RadioButton("性別",true,new{id="男"})%>男
<%=Html.RadioButton("性別",false,new{id="女"})%>女
21
22
23
24
<%=Html.LabelFor(model=>model.照片)%>
25
<%=Html.UploadImage()%>
26
27
28
29
30
31
新增的View很簡單,幾乎都是用工具產出來的,重要的只有25行,擴充了HtmlHelper的方法,方法內容如下
publicstaticclassUploadImageHelper
{
publicstaticstringUploadImage(thisHtmlHelperhelper)
stringid=Guid.NewGuid().ToString();
StringBuildersb=newStringBuilder();
//這段是在準備圖片上傳完的圖片資訊及上傳狀態
sb.AppendLine("上傳");
sb.AppendLine("");
//========================================
//下面這段是在寫出SWFUpload所需的javascript
sb.AppendLine("varswfu_"+id.Replace("-","")+";");
sb.Append("$(function(){");
sb.Append("swfu_"+id.Replace("-","")+"=newSWFUpload({");
sb.Append("upload_url:
'/Home/UploadImage',");
sb.Append("file_post_name:
'Filedata',");
sb.Append("post_params:
{");
sb.Append("'id':
'"+id+"'},");
sb.Append("file_size_limit:
'10MB',");
sb.Append("file_types:
'*.jpg;*.png;*.jpeg;*.gif;*.bmp',");
//======================================
//綁定事件
sb.Append("file_dialog_complete_handler:
fileDialogComplete,");
sb.Append("upload_progress_handler:
uploadProgress,");
sb.Append("upload_error_handler:
uploadError,");
sb.Append("upload_success_handler:
UploadImageSuccess,");
32
//==========================================
33
//上傳按鈕的資訊============================
34
sb.Append("button_image_url:
'/Scripts/btn_upload_1.png',");
35
sb.Append("button_placeholder_id:
'"+id+"_btn-upload',");
36
sb.Append("button_width:
95,");
37
sb.Append("button_height:
24,");
38
sb.Append("button_text:
'上傳圖片',");
39
sb.Append("button_text_style:
'.button{font-family:
Helvetica,Arial,sans-serif;font-size:
12pt;text-align:
center;}',");
40
sb.Append("button_text_top_padding:
1,");
41
sb.Append("button_text_left_padding:
5,");
42
sb.Append("button_window_mode:
'transparent',");
43
sb.Append("flash_url:
'/Scripts/swfupload.swf',");
44
//============================================
45
sb.AppendLine("debug:
false});})");
46
47
//下面這行是上傳後預覽的圖片tag
48
sb.AppendLine("5px;display:none;'/>");49sb.AppendLine("");50returnsb.ToString();51}52}由於都是組字串,所以可能不太好懂,但基本上都可以在文件都可以找到不外乎就是一些上傳檔案大小的設定,按鈕的設定,完成或失敗時所要執行的function重要的是第31行,當上傳成功時執行UploadImageSuccess這個function,20-23行Post的路徑,及參數FileData跟id以及10-12行,與48行自行設定的資訊用好之後,把include的的檔案用一用,執行之後,就會出現下面的頁面按了之後,就可以選檔案了,不過後端也必須要接才行我設定的Post的路徑是在/Home/UploadImage程式如下01[HttpPost]02publicActionResultUploadImage(stringid,HttpPostedFileBaseFiledata)03{04//new一個自訂的物件ImageData,供等下傳Json出去用05ImageDataimgData=newImageData(){ID=id,status="0"};0607//判斷否有檔案,及圖檔的附檔明有沒有符合08if(Filedata!=null&&09Regex.IsMatch(Path.GetExtension(Filedata.FileName),"^[.](jpg|png|jpeg|gif|bmp)$",RegexOptions.IgnoreCase))10{11//先將圖片存在tempFile這個暫存的資料夾12stringtmpPath=Server.MapPath("~/tempFile");1314//當資料夾不存在時,建立此資料夾15if(!Directory.Exists(tmpPath))16Directory.CreateDirectory(tmpPath);1718//將檔案存檔19tmpPath=Path.Combine(tmpPath,imgData.ID+Path.GetExtension(Filedata.FileName));20Filedata.SaveAs(tmpPath);2122//將路徑資訊跟狀態指到物件中23imgData.imgSrc="/tempFile/"+imgData.ID+Path.GetExtension(Filedata.FileName);24imgData.status="1";25}26//傳回Json格式27returnJson(imgData);28}自訂的物件1classImageData2{3publicstringimgSrc{get;set;}4publicstringimgName{get;set;}5publicstringID{get;set;}6publicstringstatus{get;set;}7}還記得剛剛在設定上傳成功時要去執行UploadImageSuccess這個function嗎SWFload範例有附一些function,但為了需要所以我修改了這個function01functionUploadImageSuccess(file,serverData){02varretVal=eval('('+serverData+')');03if(retVal.status=='1'){04$('#上傳狀態').html('上傳成功:'+file.name);05$('#picName').val(retVal.imgSrc);06$('#tmp_img').attr('src',retVal.imgSrc).show();07//下面是裁圖的jQuery========08$('#tmp_img').Jcrop({09setSelect:[0,0,250,250],10onSelect:updateCoords11});12//===========================13}14else{15$('#上傳狀態').html('上傳失敗!');16}17}function內容滿簡單的,先判斷狀態如果是1代表上傳成功在先前的helper中已經訂好的id名稱一一對上id="上傳成功"的內容放入上傳成功及檔名id="picName"是一個隱藏欄位,放暫存圖片的路徑id="tmp_img"將src的值改為暫存圖片的路徑7-11行是裁圖的jQuery等等再說完成之後,點上傳檔案選擇完檔案之後,就可以看到成果啦突然覺得篇幅太長,分成上下兩篇好了。下functionUploadImageSuccess(file,serverData){02varretVal=eval('('+serverData+')');03if(retVal.status=='1'){04$('#上傳狀態').html('上傳成功:'+file.name);05$('#picName').val(retVal.imgSrc);06$('#tmp_img').attr('src',retVal.imgSrc).show();07//下面是裁圖的jQuery========08$('#tmp_img').Jcrop({09setSelect:[0,0,250,250],10onSelect:updateCoords11});12//===========================13}14else{15$('#上傳狀態').html('上傳失敗!');16}17}我只設定了setSelect,代表初始的框框大小及位置與onSelect,代表選取時去執行updateCoords這個function下面貼完整的View出來0102//選取時執行的function03functionupdateCoords(c){04jQuery('#X').text(c.x);05jQuery('#Y').text(c.y);06jQuery('#W').text(c.w);07jQuery('#H').text(c.h);08jQuery('#picX').val(c.x);09jQuery('#picY').val(c.y);10jQuery('#picW').val(c.w);11jQuery('#picH').val(c.h);1213};1415Create
5px;display:
none;'/>");
49
50
returnsb.ToString();
51
}
52
由於都是組字串,所以可能不太好懂,但基本上都可以在文件都可以找到
不外乎就是一些上傳檔案大小的設定,按鈕的設定,完成或失敗時所要執行的function
重要的是第31行,當上傳成功時執行UploadImageSuccess這個function,
20-23行Post的路徑,及參數FileData跟id
以及10-12行,與48行自行設定的資訊
用好之後,把include的的檔案用一用,執行之後,就會出現下面的頁面
按了之後,就可以選檔案了,不過後端也必須要接才行
我設定的Post的路徑是在/Home/UploadImage
程式如下
[HttpPost]
publicActionResultUploadImage(stringid,HttpPostedFileBaseFiledata)
//new一個自訂的物件ImageData,供等下傳Json出去用
ImageDataimgData=newImageData(){ID=id,status="0"};
//判斷否有檔案,及圖檔的附檔明有沒有符合
if(Filedata!
=null&&
Regex.IsMatch(Path.GetExtension(Filedata.FileName),"^[.](jpg|png|jpeg|gif|bmp)$",RegexOptions.IgnoreCase))
//先將圖片存在tempFile這個暫存的資料夾
stringtmpPath=Server.MapPath("~/tempFile");
//當資料夾不存在時,建立此資料夾
if(!
Directory.Exists(tmpPath))
Directory.CreateDirectory(tmpPath);
//將檔案存檔
tmpPath=Path.Combine(tmpPath,imgData.ID+Path.GetExtension(Filedata.FileName));
Filedata.SaveAs(tmpPath);
//將路徑資訊跟狀態指到物件中
imgData.imgSrc="/tempFile/"+imgData.ID+Path.GetExtension(Filedata.FileName);
imgData.status="1";
//傳回Json格式
returnJson(imgData);
自訂的物件
1
classImageData
2
3
publicstringimgSrc{get;set;}
4
publicstringimgName{get;set;}
5
publicstringID{get;set;}
6
publicstringstatus{get;set;}
7
還記得剛剛在設定上傳成功時要去執行UploadImageSuccess這個function嗎
SWFload範例有附一些function,但為了需要所以我修改了這個function
functionUploadImageSuccess(file,serverData){
varretVal=eval('('+serverData+')');
if(retVal.status=='1'){
$('#上傳狀態').html('上傳成功:
'+file.name);
$('#picName').val(retVal.imgSrc);
$('#tmp_img').attr('src',retVal.imgSrc).show();
//下面是裁圖的jQuery========
$('#tmp_img').Jcrop({
setSelect:
[0,0,250,250],
onSelect:
updateCoords
});
//===========================
else{
$('#上傳狀態').html('上傳失敗!
');
function內容滿簡單的,先判斷狀態如果是1代表上傳成功
在先前的helper中已經訂好的id名稱一一對上
id="上傳成功"的內容放入上傳成功及檔名
id="picName"是一個隱藏欄位,放暫存圖片的路徑
id="tmp_img"將src的值改為暫存圖片的路徑
7-11行是裁圖的jQuery等等再說
完成之後,點上傳檔案選擇完檔案之後,就可以看到成果啦
突然覺得篇幅太長,分成上下兩篇好了。
下
我只設定了setSelect,代表初始的框框大小及位置
與onSelect,代表選取時去執行updateCoords這個function
下面貼完整的View出來
//選取時執行的function
functionupdateCoords(c){
jQuery('#X').text(c.x);
jQuery('#Y').text(c.y);
jQuery('#W').text(c.w);
jQuery('#H').text(c.h);
jQuery('#picX').val(c.x);
jQuery('#picY').val(c.y);
jQuery('#picW').val(c.w);
jQuery('#picH').val(c.h);
};
<%--顯示出目前框框的左上角座標及寬高--%>
X:
Y:
寬:
高:
<%--隱藏欄位,要傳左上角座標及寬高到後端--%>
53
54
55
56
<%=Html.ActionLink("BacktoList","Index")%>
57
加上上方的程式碼後,在圖片上傳完後,就可以看到下面的效果
可以自由的調整框框大小。
上方也會顯示出現在的位置及寬高
終於到最後一步,新增該筆資料啦,將資料打完,圖片上傳好後
按下Create,在後端寫好對應的Action如下
publicActionResultCreate(SWFandCropdata,stringpicName,intpicX,intpicY,intpicW,intpicH)
//利用路徑開啟這個圖檔
System.Drawing.Imageimage=Bitmap.FromFile(Server.MapPath("~")+picName);
//下面就是裁圖的程式,短短幾行
Bitmapbmp=ne
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2