如果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 下載地址 在下面: