图片文件的分布式存储 ( 简单的负载均衡)


注意UI层的web.config配置文件需要ADO..NET的连接初始化配置节点

<add name="MySalesEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=MySales;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
及用到EF的,EF必须依赖的三个节点要要添加到we.config配置文件中来

1。设计思路:

假如有2台存储图片的服务器,服务器1 和服务器 2

服务器1的地址是:192.168.12.1:22836

服务器2的地址是:192.168.12.2 :500

服务器1上有一个专门处理用户从客户端发过来的图片的一般处理程序,叫 FileUp.ashx

服务器2上也有一个专门处理用户从客户端发过来的图片的一般处理程序,叫 FileUp.ashx


我们首先有这两台存储图片的服务器,但是可能有台服务器的状态可能有问题,对于状态有问题的服务器我们给他们做给标识,就标识它为false吧,我们首先将那些状态没有问题的服务器筛选出来,如果这两台服务器都没有问题,那么我们就从这两台服务器中随机的取一台。

假设我们取到的是第一台服务器,那么它处理图片的地址就是:http://192.168.121:22836/ImageUp.ashx

下面我们来看看服务器中的这两张表


内容


-------------------------------------------------------------------------------------------------------------------------------------------






___________________________________________________________________________________

UI层代码

HomeController.cs 控制器

using Mvc.DFS.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;

namespace Mvc.DFS.Web.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult FileUp()
        {

            HttpPostedFileBase file = Request.Files["FileUp"];
            //获取用户提交过来的图片名称
            string fileName = file.FileName;
            //获取图片的扩展名
            string fileExt = Path.GetExtension(fileName);
            if (fileExt == ".jpg" || fileExt == ".png" || fileExt == ".JPEG" || fileExt == ".BMP")
            {
                //从服务器信息表中筛选出可用的图片服务器集合,记作C,并获取集合的总记录数N,然后用随机函数产生一个随机数R1,并用R1与N进行取余运行记作I,即I=R1%N,则C[I]即为要保存图片的图片服务器

                MySalesEntities db = new MySalesEntities();
                //获取服务器状态为true的服务器(即获取可以使用的那些服务器)
                var list = db.Set<ImageServerInfo>().Where(c => c.FlgUsable == true).ToList();

                //获取可以使用的服务器数量
                int listCount = list.Count();

                //------从可用的服务器中随机获取一台服务器----------
                Random rendom = new Random();

                int r = rendom.Next();
                int i = r % listCount;

                //随机拿到一台可用服务器
                ImageServerInfo imageServer = list[i];


                //-----------------服务器拿到了,那我们就开始利用WebClinent类来请求服务器了
                //请求的服务器地址
                string requestUrl = imageServer.ServerUrl;

                //请求的服务器编号
                int serverId = imageServer.ServerId;

                //构建一个完整的服务器请求地址 (参数serverId是服务器ID,参数ext是图片的扩展名)
                string fullUrl = "http://" + requestUrl + "/FileUP.ashx?serverId=" + serverId + "&ext=" + fileExt;



                WebClient client = new WebClient();
                //file.InputStream 就是上传文件的文件流
                client.UploadData(fullUrl, StreamToByte(file.InputStream));


            }

            return Content("OK");
        }

        //将一个流转换成二进制数组
        private byte[] StreamToByte(Stream stream)
        {
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length);

            //读完后跳到开始流的开始位置
            stream.Seek(0, SeekOrigin.Begin);
            return buffer;
        }

    }
}

Index视图

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <form action="/Home/FileUp" method="post"  enctype="multipart/form-data" >
            <input type="file" name="fileUp" />
            <input type="submit" value="上传" />

        </form>
    </div>
</body>
</html>
视图界面

服务器

FileUp.ashx文件

using Mvc.DFS.Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;

namespace Web.DFS.ImageService1
{
    /// <summary>
    /// FileUp 的摘要说明
    /// </summary>
    public class FileUp : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";

            string serverId = context.Request["serverId"];
            string fileExt = context.Request["ext"];

            //指定一个用来保存图片的目录
            string dir="/Image/"+DateTime.Now.Year+"/"+DateTime.Now.Month+"/"+DateTime.Now.Day+"/";

            //创建这个目录
            Directory.CreateDirectory(Path.GetDirectoryName(context.Request.MapPath(dir)));

            //新的文件名(为一个guid)
            string newFileName = Guid.NewGuid().ToString();
            string fullFilePath = dir + newFileName + fileExt;
            var path = context.Request.MapPath(fullFilePath);
            using (FileStream stream = File.OpenWrite(path))
            {
                //读取用户从客户端发送过来的这个图片,并将它写入到dir这个目录下保存
                context.Request.InputStream.CopyTo(stream);


                //然后将这张图片的信息保存到ImageInfo表中
                ImageInfo imageinfo = new ImageInfo();
                //imageinfo.Id = 1;
                imageinfo.ImageName = fullFilePath;
                imageinfo.ImageServerId = int.Parse(serverId);


                MySalesEntities db = new MySalesEntities();
                //db.Set<ImageInfo>().Add(imageinfo);
                db.ImageInfo.Add(imageinfo);
                db.SaveChanges();
                
            }

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值