前言:
在我們開發中,上傳圖片這樣的需求很常見。這幾天我在做項目的時候就遇到了,在用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; }
}
}
效果圖
保存到後臺的圖片