网站内容管理系统上传图片(本篇第一种图片上传的方法和使用范围和优缺点的区别)

优采云 发布时间: 2021-12-11 09:02

  网站内容管理系统上传图片(本篇第一种图片上传的方法和使用范围和优缺点的区别)

  图片上传和显示是互联网应用中比较常见的功能。最近的一个门户项目网站,有多个需要上传图片的功能模块。关于这部分内容,原来的功能并不复杂,但是后面做起来还是有些波折的。由于经验不足,对上传多张图片的方法、使用范围、优缺点等都不是很了解,导致在做相关功能的时候走了不少弯路。

  一开始我用的是SaveAs(...)方法来保存图片(这个方法也记录在这个博客中),因为这个方法比其他方法简单很多。当我用这个方法把后台所有的图片上传模块都做完了,准备把数据绑定到portal网站前台页面的时候,就出现了黑幕,因为这个方法只能保存数据在当前项目下的文件夹中,并且只能被当前项目访问。我的门户网站的前台和后台管理系统是两个不同的项目。导致后台上传的图片无法通过门户网站的前台获取。那个时候,我的心凉了,这意味着我不得不重新做我以前上传图片的所有模块。我被噎住了 但没有办法。吃一口长成智者,毕竟是菜鸟。没有经验。

  在这个博客中,我主要想记录第一个图片上传方法。前端使用的图片上传控件为layui,数据库为sql server,代码优先开发模式。为了避免一些不必要的额外工作量,我会直接在公司的一个开发框架上进行开发,但是(如果你像我这样的菜鸟)不要太担心,因为在实际应用中并没有什么。公司框架紧密耦合,不可或缺。

  我开始在下面写:

  一、创建表

  由于图片上传后需要保存路径等信息,所以必须先创建一个Image表。表设计如下:

  字段名称

  类型

  评论

  ID

  指南

  首要的关键

  名称

  nvarchar(50)

  图片名称

  网址

  nvarchar(50)

  关联

  上传时间

  约会时间

  上传时间

  评论

  nvarchar(200)

  评论

  删除

  布尔值

  是否被删除

  我们看一下实体类和上下文的代码:

  1.新实体类Image.cs

  如图:

  代码显示如下:

  图像文件

  using System;

using System.Collections.Generic;

using System.ComponentModel.DataAnnotations;

using System.ComponentModel.DataAnnotations.Schema;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Modules

{

[Table("Info_Image")]

public class Image

{

public Image() {

IsDelete = false;

}

///

/// 主键id

///

public Guid Id { get; set; }

///

/// 图片名

///

[Required]

[MaxLength(50)]

public string Name { get; set; }

///

/// 图片保存链接

///

[Required]

[MaxLength(50)]

public string Url { get; set; }

///

/// 上传时间

///

public DateTime UploadTime { get; set; }

///

/// 备注

///

[MaxLength(200)]

public string Remark { get; set; }

///

/// 是否删除

///

public bool IsDelete { get; set; }

}

}

  2.将实体类添加到上下文中:

  如图:

  代码:

  MyDbContext.cs

   public DbSet Images { get; set; }

  如果你和我一样是code first的开发模式,那就让程序再运行一下,这个数据表应该在你的数据库里生成了,哈哈,这只是一个建表过程,只要建表就可以,任何模式好吧,哈哈。

  二、前端代码

  1.新建控制器ImageUploadController.cs,然后创建视图Index.cshtml:

  这里会用到layui的图片上传,关于这部分代码的使用,可以到layui官网查看:;

  下面是页面图片,以及代码:

  这是没有写后台上传图片的代码时的页面图片:

  以下是前端代码:

  @{

Layout = "../Shared/_TopLayout.cshtml";

}

Index

图片标题

备注

上传图片

上传图片

图片展示

<img class="layui-upload-img" id="demo1" style="width:200px;height:auto;">

layui.use(&#x27;upload&#x27;, function () {

var $ = layui.jquery;

var upload = layui.upload;

//普通图片上传

var uploadInst = upload.render({

elem: &#x27;#test1&#x27;,

url: &#x27;@Url.Action("Upload","ImageUpload")&#x27;, //上传地址,后台的某个控制器

before: function (obj) {

obj.preview(function (index, file, result) {

$(&#x27;#demo1&#x27;).attr(&#x27;src&#x27;, result);

});

}, //长传之前执行的代码,将需要上传的图片显示在页面上

done: function (res) {

if (res.Result) {

}

}, //上传成功后的回传数据,后台代码未编写,此处尚为写任何内容,将在后面的内容中补上

error: function () {

//演示失败状态,并实现重传

var demoText = $(&#x27;#demoText&#x27;);

demoText.html(&#x27;上传失败 <a class="layui-btn layui-btn-xs demo-reload">重试</a>&#x27;);

demoText.find(&#x27;.demo-reload&#x27;).on(&#x27;click&#x27;, function () {

uploadInst.upload();

});

}

});

});

  三、后端代码和前端代码完美

  接下来在上面代码中显示的后台链接(

  ) 编写图片上传代码:

  先贴出代码,再说明上传思路:

  图片上传控制器.cs

   ///

/// 上传图片

///

///

public ActionResult Upload()

{

try

{

HttpFileCollectionBase files = Request.Files;

HttpPostedFileBase file = files[0];

//获取文件名后缀

string extName = Path.GetExtension(file.FileName).ToLower();

//获取保存目录的物理路径

if (System.IO.Directory.Exists(Server.MapPath("/Images/")) == false)//如果不存在就创建images文件夹

{

System.IO.Directory.CreateDirectory(Server.MapPath("/Images/"));

}

string path = Server.MapPath("/Images/"); //path为某个文件夹的绝对路径,不要直接保存到数据库

// string path = "F:\\TgeoSmart\\Image\\";

//生成新文件的名称,guid保证某一时刻内图片名唯一(文件不会被覆盖)

string fileNewName = Guid.NewGuid().ToString();

string ImageUrl = path + fileNewName + extName;

//SaveAs将文件保存到指定文件夹中

file.SaveAs(ImageUrl);

//此路径为相对路径,只有把相对路径保存到数据库中图片才能正确显示(不加~为相对路径)

string url = "\\Images\\" + fileNewName + extName;

return Json(new

{

Result = true,

Data = url

});

}

catch (Exception exception)

{

return Json(new

{

Result = false,

exception.Message

});

}

}

  上面代码中有详细的注释信息。这里需要注意的是我们保存图片的路径问题。

  Server.MapPath()函数获取的是某个文件夹的绝对路径,关于这个函数的一些用法我百度一份截图贴在这里:

  (图片来自网络截图)

  从上图中Server.MapPath()获取图片的绝对路径。在实际调用图片时,考虑到网站的安全性,浏览器不允许我们的页面使用绝对路径获取图片资源。所以数据库中保存的路径只能是相对路径,就是代码中这句话的作用:

  上面代码中,我没有直接将imageUrl保存到数据库中,而是生成了一个相对路径来保存图片,原因是这样的。

  下面给出完整的前端代码,包括图片上传的改进和所有信息的保存:

<p>@{

Layout = "../Shared/_TopLayout.cshtml";

}

Index

图片标题

备注

上传图片

上传图片

图片上传前展示

<img class="layui-upload-img" id="demo1" style="width:200px;height:auto;">

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线