Asp.Net中WebApi多圖片上傳(附前後端代碼)

前言:

       在我們開發中,上傳圖片這樣的需求很常見。這幾天我在做項目的時候就遇到了,在用webapi中做上傳圖片和MVC和一般處理程序還不一樣,後臺老是拿不到前臺傳遞的數據,之前用一般處理程序和MVC就沒遇到這種情況,經過幾天的查詢資料,今天終於實現了,利用的是Base64編碼傳輸,後端接受Base64的編碼數據進行解析,將圖片保存。

下面不多說直接進入正題。

前端代碼 ajax3

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
    </head>
    <style type="text/css">
    	 .float{   
 
        float:left;   
 
        width : 200px;   
 
        height: 200px;  
 
         overflow: hidden;   
 
        border: 1px solid #CCCCCC;  
 
         border-radius: 10px;   
 
        padding: 5px; 
 
          margin: 5px;  
 
     }   
 
    img{   
 
        position: relative;  
 
     }   
 
    .result{   
 
        width: 200px;   
 
        height: 200px;  
 
         text-align: center;   
 
        box-sizing: border-box;  
 
     }
 
    #file_input{ 
 
        display: none; 
 
    }
    </style>
    <script type="text/javascript" src="jquery-2.1.4/jquery.min.js"></script>
    <script>
    	window.onload = function(){   
 
    var input = document.getElementById("file_input");   
 
    var result;   
 
    var dataArr = []; // 儲存所選圖片的結果(文件名和base64數據) 
    var guid="123456";
 
    var fd;  //FormData方式發送請求   
 
    var oSelect = document.getElementById("select"); 
 
    var oAdd = document.getElementById("add"); 
 
    var oSubmit = document.getElementById("submit"); 
 
    var oInput = document.getElementById("file_input"); 
 
    if(typeof FileReader==='undefined'){   
 
        alert("抱歉,你的瀏覽器不支持 FileReader");   
 
        input.setAttribute('disabled','disabled');   
 
    }else{   
 
        input.addEventListener('change',readFile,false); 
 
      }
 
    function readFile(){  
 
        fd = new FormData();
 
           var iLen = this.files.length; 
 
        var index = 0; 
 
        for(var i=0;i<iLen;i++){ 
 
            if (!input['value'].match(/.jpg|.gif|.png|.jpeg|.bmp/i)){  //判斷上傳文件格式   
 
                return alert("上傳的圖片格式不正確,請重新選擇");   
 
            } 
 
            var reader = new FileReader(); 
 
            reader.index = i;   
 
            fd.append(i,this.files[i]); 
 
            reader.readAsDataURL(this.files[i]);  //轉成base64
 
               reader.onload = function(e){ 
 
                 var imgMsg = this.result ;
 
                dataArr.push(imgMsg);  
 
                result = '<div class="result"><img src="'+this.result+'" alt=""/></div>';   
 
                var div = document.createElement('div'); 
 
                div.innerHTML = result;   
 
                div['className'] = 'float'; 
 
                div['index'] = index;   
 
                document.getElementsByTagName('body')[0].appendChild(div);    //插入dom樹   
 
                var img = div.getElementsByTagName('img')[0]; 
 
                img.onload = function(){   
 
                    var nowHeight = ReSizePic(this); //設置圖片大小   
 
                    this.parentNode.style.display = 'block';   
 
                    var oParent = this.parentNode;   
 
                    if(nowHeight){   
 
                        oParent.style.paddingTop = (oParent.offsetHeight - nowHeight)/2 + 'px';   
 
                    }   
 
                }
 
                index++; 
 
            }   
 
        }   
 
    }  
 
    function send(){  
 
        var submitArr = []; 
 
        for (var i = 0; i < dataArr.length; i++) { 
 
            if (dataArr[i]) { 
 
                submitArr.push(dataArr[i]); 
 
            } 
 
        } 
 
        $.ajax({   
 
            url : 'http://localhost:63938/ApiRoot/TestUpLoadImg/UpLoadImg', 
 
              type : 'post',
 
            data : {"image":dataArr,"guid":guid},   
 
            dataType: 'json',   
 
             success : function(data){   
 
                if (data == 1) {
 
                    alert("圖片上傳成功");
 
                }else{
 
                    alert("圖片上傳失敗");
 
                }
 
           }
 
        })   
 
    }
 
    oSelect.οnclick=function(){  
 
        oInput.value = "";   // 先將oInput值清空,否則選擇圖片與上次相同時change事件不會觸發 
 
        $('.float').remove();  //清空已選圖片 
 
        dataArr = []; 
 
         index = 0;    
 
             oInput.click();  
 
    }  
 
    oAdd.οnclick=function(){ 
 
        oInput.value = "";   // 先將oInput值清空,否則選擇圖片與上次相同時change事件不會觸發 
 
        oInput.click();  
 
    }  
 
    oSubmit.οnclick=function(){  
 
         if(!dataArr.length){   
 
            return alert('請先選擇文件');   
 
        }   
 
        send();   
 
    }   
 
}              
function ReSizePic(ThisPic) {   
 
    var RePicWidth = 200; //這裏修改爲您想顯示的寬度值
 
          var TrueWidth = ThisPic.width; //圖片實際寬度   
 
    var TrueHeight = ThisPic.height; //圖片實際高度 
 
        if(TrueWidth>TrueHeight){   
 
        var reWidth = RePicWidth;//寬大於高 
 
        ThisPic.width = reWidth;    
 
        var nowHeight = TrueHeight * (reWidth/TrueWidth); //垂直居中   
 
         return nowHeight;  //將圖片修改後的高度返回,供垂直居中用   
 
    }else{  
 
         var reHeight = RePicWidth; //寬小於高    
 
         ThisPic.height = reHeight; 
 
      }   
 
}   
    </script>
    <body>
    	<div class="container">   
 
            <label>請選擇一個圖像文件:</label> 
 
            <button style="display:none;" id="select">(重新)選擇圖片</button> 
 
            <button id="add">選擇上傳圖片</button> 
 
            <input type="file" id="file_input" multiple/>
             <!--用input標籤並選擇type=file,記得帶上multiple,不然就只能單選圖片了-->   
 
            <button id="submit">提交</button>
 
        </div>   
    </body>
</html>

後端代碼


public class TestUpLoadImgController : ApiController
    {
        int status = 0;
        //用List集合保存傳遞過來的Base654格式的圖片,前端是用數組存圖片進行發送後端的
        //傳遞的是一個Data對象,我的控制器也用對象類型接受
        public int UpLoadImg(Funny funnyInfo)
        {
            //前端傳遞的data裏的key必須和後臺類裏的字段保持一致,否則接受不到前端傳遞的數據
            List<string> imgInfoList = funnyInfo.image;
            string guids = funnyInfo.guid;
            if (imgInfoList != null)
            {
                //圖片保存的路徑
                string imgPath = HostingEnvironment.MapPath("~/img/");
                if (!Directory.Exists(imgPath))
                {
                    Directory.CreateDirectory(imgPath);
                }
                else
                {
                    
                    foreach (var item in imgInfoList)
                    {
                        Guid guid = Guid.NewGuid();
                        //將圖片保存爲jpg格式,圖片名爲guid.jpg
                        string path = imgPath + guid + ".jpg";
                        //調用方法解析Base64編碼的圖片,並保存圖片
                        Base64ToImg(item.Split(',')[1]).Save(path);
                    }
                }
                status = 1;
            }
            return status;
        }
        //解析base64編碼獲取圖片
        private Bitmap Base64ToImg(string base64Code)
        {
            MemoryStream stream = new MemoryStream(Convert.FromBase64String(base64Code));
            return new Bitmap(stream);
        }
        public class Funny
        {
            //用List集合保存傳遞過來的Base654格式的圖片,前端是用數組存圖片進行發送後端的
            //傳遞的是一個Data對象,我的控制器也用對象類型接受
            public List<string> image { get; set; }
            public string guid { get; set; }
        }
    }

效果圖

保存到後臺的圖片

發佈了115 篇原創文章 · 獲贊 9 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章