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