背景:做一个用户反馈接口,需要上传图片,数据库有两张表:Issue与IssueImg,存问题与问题附带图片,主表为Issue,IssueImg里的图片路径通过绑定Issue事件的ID来判断哪张图片属于哪个事件。
逻辑:前端上传图片,后端保存并返回其图片ID,前端整合图片ID为ImgID[ ]后夹带到表单数据中一块带传过来。
代码:图片处理接口
try
{
MxWeiXinPF.BLL.TicketIssue issue = new MxWeiXinPF.BLL.TicketIssue();
//MxWeiXinPF.Model.TicketIssue model = new MxWeiXinPF.Model.TicketIssue();
MxWeiXinPF.Model.IssueImg ImgModel = new MxWeiXinPF.Model.IssueImg();
HttpRequest request = System.Web.HttpContext.Current.Request;
//HttpFileCollection FileCollect = request.Files;
HttpPostedFile file = System.Web.HttpContext.Current.Request.Files[0];
string imgName = DateTime.Now.ToString("yyyyMMddhhmmss");//获取时间戳
Stream sr = file.InputStream; //文件流
Bitmap bitmap = (Bitmap)Bitmap.FromStream(sr);
switch (request.Form["ImageType"])//上传图片时带的参数,方便把一个控制器做为多个入口
{
case "0": //0代表用户反馈
string imgPath = "/image/issue" + imgName + file.FileName.Substring(file.FileName.LastIndexOf("."));//组成保存的相对路径
string currentpath = System.Web.HttpContext.Current.Server.MapPath(imgPath);//获取项目根目录路径并拼接相对路径,组成绝对路径
bitmap.Save(currentpath);//文件保存
ImgModel.ImagePath = imgPath;
ImgModel.ImgID = Convert.ToString(issue.AddImg(ImgModel));//保存相关数据到数据库并返回其ID,语句另查
break;
}
return Json(new
{
result = 0,
msg = "",
ImgModel.ImgID
});
}
catch (System.Exception Ex)
{
return Json(new {
result = -1,
msg = "请求失败",
Ex });
}
到这里的话图片上传和传数据库都完成了,但是由于是用户先上传图片再生成事件,所以还需要更新一下IssueImg表与生成issue
表单接口
MxWeiXinPF.Model.TicketIssue model = new MxWeiXinPF.Model.TicketIssue();//这里是model
//ImgID是图片ID的数组
JArray ImgID = new JArray(true);
ImgID = ((dynamic)value).ImgID;
//model.属性等于调用里面的set方法,可以赋值数据
model.Type = ((dynamic)value).Type;
model.wxUserID = Convert.ToInt32(((dynamic)value).wxUserID);
model.Title = ((dynamic)value).Title;
//获取系统时间
model.ReportDate = Convert.ToDateTime(DateTime.Now);
model.LastUpdDate = Convert.ToDateTime(DateTime.Now);
int IssueID = Convert.ToInt32(issue.AddIssue(model));//保存到数据库,这里就不写出来了,IssueID是添加行返回的ID
ImgModel.IssueID = IssueID;
//如果ImgID不为空就遍历数组,并把
if (ImgID!= null)
{
for (int i = 0; i < ImgID.Count; i++)
{
ImgModel.ID = Convert.ToInt32(ImgID[i]);
if (!issue.UpdateIssueImg(ImgModel))
{
return Json(new
{
result = -1,
msg = "请求失败"
});
}
}
}
return Json(new
{
result = 0,
msg = "",
IssueID
});
至此就完成了,但是还个问题就是上传错的图片怎么删除//ImagePath为数据库存的相对图片路径属性,通过前端传过来的图片ID到数据库查询对应row并返回属性。
System.IO.File.Delete(System.Web.HttpContext.Current.Server.MapPath(ImagePath));
//System.Web.HttpContext.Current.Server.MapPath//可以获取当前项目的绝对路径。