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 下载地址 在下面:
C# net部署图片分布式存储服务器的小案例的更多相关文章
- 测试开发Python培训:实现屌丝的图片收藏愿望(小插曲)
测试开发Python培训:实现屌丝的图片收藏愿望(小插曲) 男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追 ...
- 8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署
这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook 总要和一些数据库打交道吧,比如说 ...
- 批量下载网站图片的Python实用小工具(下)
引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...
- javaweb图片上传 tomcat重新部署 图片消失
标签: 图片上传tomcat重新部署图片消失原因分析以及解决办法 最近在做一个Javaweb的项目,涉及到图片上传,并且需要将图片通过URL回显给JSP页面,在调试的时候发现,上传到tomcat的 ...
- JavaScript_DOM学习篇_图片切换小案例
今天开始学习DOM操作,下面写一个小案例来巩固下知识点. DOM: document object model (文档对象模型) 根据id获取页面元素 : 如: var xx = document.g ...
- 三、Linux部署MinIO分布式集群
MinIO的官方网站非常详细,以下只是本人学习过程的整理 一.MinIO的基本概念 二.Windows安装与简单使用MinIO 三.Linux部署MinIO分布式集群 四.C#简单操作MinIO 一. ...
- CentOS 7.6 部署 GlusterFS 分布式存储系统
文章目录 GlusterFS简介 环境介绍 开始GlusterFS部署 配置hosts解析 配置GlusterFS 创建文件系统 安装GlusterFS 启动GlusterFS 将节点加入到主机池 创 ...
- zabbix Server 4.0 部署及之内置item使用案例
zabbix Server 4.0 部署及之内置item使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.zabbix组件架构概述(图片摘自网络) 1>.zabbi ...
- 机械表小案例之transform的应用
这个小案例主要是对transform的应用. 时钟的3个表针分别是3个png图片,通过setInterval来让图片转动.时,分,秒的转动角度分别是30,6,6度. 首先,通过new Date函数获取 ...
随机推荐
- centos 5.4 安装nodejs + npm(转)
而在安装nodejs的时候,需要用到,所以需要手动安装bz2库. sudo yum install -y bzip2* cd Python-/Modules/zlib ./configure make ...
- EventBus3.0使用总结
在Android中,接口回调已经能够处理掉大部分业务需求了,实在太变态的需求就用广播也能够完成,自己写的性能好出问题也好解决.....工作需要,不得不看看EventBus的用法,今天就来介绍一下学习经 ...
- WPF Command命令模式
//定义接口 public interface IView { bool IsChanged { get; set; } void SetBinding(); void Clear(); } //定义 ...
- C++学习(二)
九.3.内联1)编译器用函数的二进制代码替换函数调用语句,减少函数调用的时间开销.这种优化策略成为内联.2)频繁调用的简单函数适合内联,而稀少调用的复杂函数不适合内联.3)递归函数无法内联.4)通过i ...
- 数据结构与算法JavaScript 读书笔记
由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...
- 图灵API
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine( ...
- android 6.0特性翻译 --渣渣
所有关于Android 6.0 棉花糖的知识 上下文帮助 1.现在按压:不需要离开你正在运行的app或者访问的网站就可 获取帮助,仅仅触摸和按下Home按钮.(长按Home键,可以在 android ...
- mysql嵌套查询
select * from(select t.`name` `name`,count(*) count from company t group by t.`name`) aa where aa.co ...
- 修改sqlplus提示符
如图所示 : 修改 提示符为 username(sid_serial#)@instance_name ,这样其实很方便的 以下是步骤 在11g中glogin.sql 文件是不存在的,取而代之的是 lo ...
- IOS_OC_百度地图与社交分享
前奏. 知识点介绍 一. 导航和画线 地图画线 (理解) 二. 百度地图 集成百度地图 (掌握) POI检索 (掌握) 三. 社交分享 系统自带分享 (了解) 友盟分享 (掌握) SSO授权 (理解) ...