1. 程式人生 > 其它 >vue elementUI 圖片上傳

vue elementUI 圖片上傳

實現多張圖片和單張圖片上傳和刪除功能。

前端程式碼如下:

<style>
    #app {
        background-color: white;
        padding: 15px 15px;
    }

    .el-row {
        margin: 60px 20px;
    }

    input[type="file"] {
        display: none;
    }

    .el-form-item__content {
        display: inline-block;
    }
</style>
<div id="app"> <el-button type="primary" icon="el-icon-arrow-left" v-on:click="ReturnGoodsList()">返回</el-button> <el-form ref="form" :model="form" status-icon :rules="rules" label-width="100px;" class="demo-ruleForm"> <el-row> <el-col :span
="4"> <el-form-item label="兌換名稱:" prop="Name"> <el-input v-model="form.Name"></el-input> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="所需積分:" prop="RequireScore"
> <el-input v-model.number="form.RequireScore"></el-input> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="每人限額:" prop="PerPersonCount"> <el-input v-model.number="form.PerPersonCount"></el-input> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="總共份額:" prop="Stock"> <el-input v-model.number="form.Stock"></el-input> </el-form-item> </el-col> <el-col :span="4"> <el-form-item label="價格:" prop="Price"> <el-input v-model="form.Price"></el-input> </el-form-item> </el-col> </el-row> <el-row style="margin-top:20px;"> <el-col :span="1"> <label>商品展示圖:</label> </el-col> <el-col :span="23"> <el-upload style="display:inline-block;" action="/api/score-mgr/Score/GoodsUploadImg" list-type="picture-card" :auto-upload="false" :data="getScoreForm()" ref="uploadRef" :limit="4" :multiple="true" :file-list="fileList" :on-remove="removePic" :on-success="onSuccess" :on-error="onError"> <i slot="default" class="el-icon-plus"></i> <div slot="file" slot-scope="{file}"> <img class="el-upload-list__item-thumbnail" :src="file.url" alt=""> <span class="el-upload-list__item-actions"> <span v-if="true" class="el-upload-list__item-delete" v-on:click="removePic(file)"> <i class="el-icon-delete"></i> </span> </span> </div> </el-upload> </el-col> </el-row> <el-row> <el-col :span="1"> <label>商品說明:</label> </el-col> <el-col :span="23"> @*<el-form-item label="商品說明:" prop="desc"> <textarea rows="10" v-model="form.Desc" style="width:100%;"></textarea> </el-form-item>*@ <textarea rows="30" style="width:100%" v-model="form.Desc"></textarea> </el-col> </el-row> <el-row> <el-col :span="4"> <el-form-item label="兌換截至時間:" prop=""> <el-date-picker v-model="form.Deadline" type="datetime" placeholder="選擇日期" value-format="yyyy-MM-dd HH:mm:ss"> </el-date-picker> </el-form-item> </el-col> </el-row> <el-row style="text-align:center;"> <el-button type="primary" v-on:click="SaveGoods('form')">儲存提交</el-button> </el-row> </el-form> </div> <script src="~/app-js/tools.js"></script> <script> let isSubmiting = false; let goodsId = "@(ViewBag.goodsId??0)"; let imgUrl = GetIMGUrl(); let imgLength = 0; let checkRequireScore = function (rule, value, callback) { if (!value) { return callback(new Error('所需積分不能為空')); } if (!Number.isInteger(value)) { callback(new Error('請輸入數字值')); } else { callback(); } }; let checkPerPersonCount = function (rule, value, callback) { if (!value) { return callback(new Error('每人限額不能為空')); } if (!Number.isInteger(value)) { callback(new Error('請輸入數字值')); } else { callback(); } }; let checkStock = function (rule, value, callback) { if (!value) { return callback(new Error('每人限額不能為空')); } if (!Number.isInteger(value)) { callback(new Error('請輸入數字值')); } else { callback(); } }; let checkPrice = function (rule, value, callback) { var regPos = /^\d+(\.\d+)?$/; //非負浮點數 //var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //負浮點數 if (!regPos.test(value)) { callback(new Error('請輸入數字值')); } else { callback(); } }; let fileCount = 0; let vm = new Vue({ el: "#app", data: { form: { Name: '', RequireScore: '', PerPersonCount: '', Stock: '', Desc: '', Price: '', Deadline: '', Imgs: [], removeIdList: [], }, fileList: [], uploadFileList: [], rules: { Name: [ { required: true, message: '請輸入物品名稱', trigger: 'blur' }, ], RequireScore: [ { validator: checkRequireScore, trigger: 'blur' } ], PerPersonCount: [ { validator: checkPerPersonCount, trigger: 'blur' } ], Stock: [ { validator: checkStock, trigger: 'blur' } ], Price: [ { validator: checkPrice, trigger: 'blur' } ], desc: [ { required: true, message: '請填寫商品描述', trigger: 'blur' } ] }, }, beforeCreate() { }, created() { }, beforeMount() { }, mounted() { this.loadGoods(); }, components: { }, methods: { loadGoods() { this.form.removeIdList = []; if (goodsId!="0") { ajax({ url: '/api/score-mgr/Score/GetGoods', params: { goodsId: goodsId } }).then((res) => { let data = res.data; if (data.Result) { this.form = data.Content; imgLength = data.Content.GoodsImgs.length; for (var i = 0; i < data.Content.GoodsImgs.length; i++) { let obj = new Object(); obj.url = imgUrl + data.Content.GoodsImgs[i].ImageUrl; obj.uid = data.Content.GoodsImgs[i].Id; obj.name = data.Content.GoodsImgs[i].Id; this.fileList.push(obj); } this.form.removeIdList = []; fileCount = this.fileList.length; } }).catch((err) => { console.log(err); this.form.removeIdList = []; }); } }, handleRemove(file) { }, removePic(file) { let files = this.$refs.uploadRef.uploadFiles; let index = files.findIndex(fileItem => { return fileItem.uid === file.uid }) this.form.removeIdList.push(files[index].uid); for (var i = 0; i < this.fileList.length; i++) { if (files[index].uid == this.fileList[i].uid) { fileCount = fileCount - 1; } } console.log(this.form.removeIdList); files.splice(index, 1); }, getScoreForm() { return this.form; }, onSuccess(res) { if (res.Result) { this.form.Imgs.push(res.Content); } else { alert("商品資訊儲存失敗,請重新整理頁面重新上傳"); return; } console.log(this.fileList.length); //if (this.form.Imgs.length + this.fileList.length == this.$refs.uploadRef.uploadFiles.length + this.form.removeIdList.length) console.log(this.form.removeIdList.length); console.log(fileCount); if (this.form.Imgs.length + fileCount == this.$refs.uploadRef.uploadFiles.length) { ajax({ url: '/api/score-mgr/Score/SaveGoods', method: "post", data: this.form }).then((res) => { let data = res.data; if (data.Result) { alert("物品配置儲存成功"); location.href = "/Score/ScoreExchange"; } }).catch((err) => { console.log(err); alert("儲存錯誤"); return; }); } }, onError(res) { isSubmiting = false; alert("設定失敗"); return; }, SaveGoods(formName) { this.$refs[formName].validate((valid) => { if (valid) { if (this.$refs.uploadRef.uploadFiles.length > fileCount) { this.form.Imgs = []; console.log(this.$refs.uploadRef.uploadFiles.length); this.$refs.uploadRef.submit(); return; } ajax({ url: '/api/score-mgr/Score/SaveGoods', method: "post", data: this.form }).then((res) => { let data = res.data; if (data.Result) { alert("物品配置儲存成功"); location.href = "/Score/ScoreExchange"; } }).catch((err) => { console.log(err); alert("儲存錯誤"); return; }); } else { alert("請填寫正確的內容,然後儲存提交!"); return false; } }); }, ReturnGoodsList() { location.href = "/Score/ScoreExchange"; } } }); </script>

因為是後端是mvc模式,前端使用vue模式呼叫介面模式是使用ajax呼叫,所以後端控制器中僅是頁面,沒有介面邏輯,具體的介面程式碼是使用api格式。

後端上傳程式碼如下:

//mvc controller 程式碼:

[MvcPermissionAuthorize("6103")]//許可權驗證
public async Task<IActionResult> AddExchangeSetting()
{
string goodsId = Request.Query["goodsId"];
ViewBag.goodsId = goodsId;
return View();
}



//介面邏輯程式碼:

///
<summary> /// 上傳圖片 /// </summary> /// <returns></returns> [HttpPost] [MvcPermissionAuthorize("6103")] public BaseResponseResult<string> GoodsUploadImg() { BaseResponseResult<string> res = new BaseResponseResult<string>(); var file = Request.Form.Files.FirstOrDefault(); if (file == null) throw new DFBusinessException("檔案為空"); var ss = Directory.GetCurrentDirectory(); //var ss1 = AppContext.BaseDirectory; //圖片上傳地址 string imgAddress = ConfigLoader.ScoreCommonSettings.UploadImageAddress; string macPath = ss + "/wwwroot" + imgAddress; if (!System.IO.Directory.Exists(macPath)) { Directory.CreateDirectory(macPath); // 不存在就建立目錄 } System.Drawing.Image img = System.Drawing.Bitmap.FromStream(file.OpenReadStream()); string fileName = Snowflake_19_Helper.NewId().ToString() + ".jpg"; string imgPath = macPath + "/" + fileName; var mstream = ImageHelper.GetThumbPicStream(file.OpenReadStream(),800,800, img.RawFormat, ThumbPicModeEnum.hw); Bitmap bt = new Bitmap(mstream); bt.Save(imgPath); bt.Dispose(); img.Dispose(); return res.GetSuccess(imgAddress+"/" + fileName); } /// <summary> /// 新添兌換物品 /// </summary> /// <returns></returns> [HttpPost] [MvcPermissionAuthorize("6103")] public async Task<BaseResponseResult<int>> SaveGoods(SaveGoodsModel goods) { List<GoodsImages> goodsImgs = new List<GoodsImages>(); if (goods.Imgs != null) for (int i = 0; i < goods.Imgs.Count; i++) { GoodsImages imgs = new GoodsImages(); imgs.Id = Snowflake_19_Helper.NewId(); imgs.GoodsId = goods.Id; imgs.ImageUrl = goods.Imgs[i]; imgs.CreateTime = DateTime.Now; goodsImgs.Add(imgs); } goods.CreateTime = DateTime.Now; var lst = await _scoreService.SaveGoods(goods, goodsImgs, goods.removeIdList); return lst; }