注意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层代码
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;
}
}
}
}