C# net部署圖片分布式存儲服務器的小案例


如果web服務用戶多了,訪問多了,用戶上傳的圖片,文件等內容放在一塊,想必服務器是承受不住的,這個時候,我們就需要考慮分布式存儲的方法了。

 

如圖所示:一個web服務器拖2個圖片服務器

如何做到用戶上傳的圖片 比較均衡的存放到兩個圖片器上----簡單的能想到 隨機數

在這兒 ,咱們就基於隨機數演示一下;

設計存儲方案的數據庫

要有一張表來存放圖片服務器的信息,還有一張表用來存放圖片的路徑;

VS2013中創建的項目目錄,大家看到創建了兩個ImageService的一般處理程序,既然圖片服務器要接收web服務器發送的圖片請求,那么就要實現其程序,部署在2個圖片服務器上的程序其實是一樣的,這兒需要在一台電腦上演示兩台圖片服務器,所以創建了多個程序

 

首先Model層  使用EF,直接從數據庫生成

 

2、圖片服務器 處理程序在這兒使用一般處理程序ashx 

   首先添加對model 成的引用

   接着新建一般處理程序  FileUp.ashx,兩個圖片服務器是一樣的

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

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            int serverId = int.Parse(context.Request["serverId"]);
            string ext = context.Request["ext"];
            string dir = "/Image/" + DateTime.Now.Day + "/";
            Directory.CreateDirectory(Path.GetDirectoryName(context.Request.MapPath(dir)));
            string newFileName = Guid.NewGuid().ToString();
            string fullDir = dir + newFileName + ext;
            using (FileStream fileStream = File.OpenWrite(context.Request.MapPath(fullDir)))
            {
                context.Request.InputStream.CopyTo(fileStream);
                ImageInfo imageInfo = new ImageInfo();
                imageInfo.ImageName = fullDir;
                imageInfo.ImageServerId = serverId;
                ImageServerEntities db = new ImageServerEntities();
                db.ImageInfo.Add(imageInfo);
                db.SaveChanges();

            }
        }

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

  3、新建web 項目 DFS.web,使用空的MVC4,  

新建Home 控制器  代碼如下:

HomeController.cs

public class HomeController : Controller
    {
        //
        // GET: /Home/
        ImageServerEntities db = new ImageServerEntities();
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult FileUp()
        {
            
            HttpPostedFileBase file = Request.Files["fileUp"];
            string fileName = Path.GetFileName(file.FileName);
            string fileExt = Path.GetExtension(fileName);
            if (fileExt == ".png" ||fileExt== ".jpg")
            {
                //從服務器狀態表篩選出可用的圖片服務器集合記作C,並獲取集合的總記錄數N,然后用隨機函數產生一個隨機數R1,並用R1與N進行取余運算記作I=R1%N。 則C[I]即為要保存圖片的圖片服務器 
                
                List<ImageServerInfo> list = db.ImageServerInfo.Where(c => c.FlgUsable == true).ToList();
                int count = list.Count();
                Random random = new Random();
                int r = random.Next();
                int i = r % count;
                ImageServerInfo imageService = list[i];
                string url = imageService.ServerUrl;//圖片服務器的地址
                int serverId = imageService.ServerId;//圖片服務器編號
                string address = "http://"+url+"/FileUp.ashx?serverId="+serverId+"&ext="+fileExt;

                WebClient client = new WebClient();
                client.UploadData(address, 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;
        }

        public ActionResult ShowImage()
        {
            var imageServerInfo = db.ImageServerInfo.Where(c => c.FlgUsable == true).ToList();
            ViewData["imageServerList"] = imageServerInfo;
            return View();
        }

    }
}

  

4、上傳頁面 Index.cshtml

<div>
        <form method="post" action="/Home/FileUp" enctype="multipart/form-data">
            <input type="file" name="fileUp" />
            <input type="submit" value="上傳" />
        </form>
    </div>

  5、顯示上傳的圖片

ShowImage.cshtml

<div>
        <h1>顯示分布式服務器中 所有圖片信息</h1>
        <ul>
            @foreach (ImageServerInfo imageService in (List<ImageServerInfo>)ViewData["imageServerList"])
            {
                foreach (var imageInfo in imageService.ImageInfo)
                {<li>
                    <img src="@string.Format("http://{0}{1}",imageService.ServerUrl,imageInfo.ImageName)" width="200" height="200" />
                </li>
                }
            
            }
        </ul>
    </div>

  至此,完成,項目demo  下載地址 在下面:

      分布式圖片存儲小demo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM