MVC保存二进制到数据库,并显示文件的方法(图片显示)
通过两篇文章解决了数据库存储图片并显示到View的方法:
http://blog.sina.com.cn/s/blog_6da396a50101639u.html
http://www.cnblogs.com/artech/archive/2012/08/14/action-result-02.html
其中,第一篇虽然有些混乱,但是对我有很大启发,而的第二篇写的就很笼统却比较了然,大体看一下就解决了令我不解的显示方法。
1.当然第一步是Img,我们在View里,给Img的文件来源,加上Action调用:
<img src=@Url.Action("GetImg", new { id = iii.DrId }) />
iii就是我们的对象实例了,这里,我们调用的是当前Controller的GetImg。
2.所以我们之后需要一个Action:
/// <summary> /// Action:获取图片文件 /// </summary> public FileContentResult GetImg(int id) { var anModel = zService.Find(id); if (anModel != null) { return File(anModel.DrImg, "image/jpg", anModel.DrId.ToString() + anModel.DrName); } else { return null; } }
这里的方法就是拷贝的我最开始提供的文章里的,并未有太多修改,注意一下“File”方法,有三个参数:
FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName)
第一个当然就是读取出来的文件数据了,第二个是要以什么类型展示文件(MimeType),第三个就是要展示到页面的文件,是什么文件名
这里要注意的是,参数3,如果这样自定义的名字,生成的结果好像是:『Id+Name+"~序号"』比如:361我是超人~3.jpg
3.至于怎么存进数据库,其实在链接文章1里有讲解,我用的是MVC和EF,代码就会类似于这样:
3.1前台,View里加Form,注意“enctype”属性,看网上的几个文章,都说要加这个。
@using (Html.BeginForm("Add", "DoctorAdmin", FormMethod.Post, new { enctype = "multipart/form-data" })) { <fieldset> <legend>DoctorInfo</legend> <div class="editor-label"> <span>图片</span> </div> <div> <input type="file" name="imgs" /> </div> <div class="editor-label"> @Html.LabelFor(model => model.DrName) </div> <div class="editor-field"> @Html.EditorFor(model => model.DrName) </div> <p> <input type="submit" value="确定" /> </p> </fieldset> }
3.2后台,Action和一个获取图片方法。
[HttpPost] public ActionResult Add(WXG_Doctor pModel) { if (pModel == null) { return HttpNotFound(); } //获取上传图片 HttpPostedFileBase file1 = Request.Files[0]; int error1; pModel.DrImg = FileUpDown.GetImageByte(out error1, file1, 1024 * 1024); zService.Create(pModel); return RedirectToAction("Add"); } /// <summary> /// 获取图片内容 /// </summary> ///<param name="pError">0:正常完成 1:文件大小异常。2:扩展名不支持。</param> /// <param name="pUpImage">要上传的文件</param> /// <param name="pFileLength">文件要小于这个大小</param> /// <returns>图片文件的内容</returns> public static byte[] GetImageByte(out int pError, HttpPostedFileBase pUpImage, int pFileLength) { if (pUpImage.FileName != null) { //要上传的文件大小判断 int sFileLength = pUpImage.ContentLength; if (sFileLength < 1 || sFileLength > pFileLength) { pError = 1; return null; } //获取文件名 string sFilename = System.IO.Path.GetFileName(pUpImage.FileName).ToLower(); //获取upImage文件的扩展名 string extendName = System.IO.Path.GetExtension(sFilename); //判断是否为图片格式 if (extendName != ".jpg" && extendName != ".jpeg" && extendName != ".gif" && extendName != ".bmp" && extendName != ".png") { pError = 2; return null; } byte[] myData = new Byte[sFileLength]; pUpImage.InputStream.Read(myData, 0, sFileLength); pError = 0; return myData; } else { pError = 3; return null; } } }
其中,返回的状态那个参数,我不知会不会写的很2,而且具体的逻辑也缺乏健壮,请大家不要直接拿来就用了,酌情修改下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本