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

时间: 2024-10-03 20:52:44

C# net部署图片分布式存储服务器的小案例的相关文章

图片预加载 小案例

1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" 2 "http://www.w3.org/TR/html4/strict.dtd"> 3 4 <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 5 <head> 6 <meta http-equiv="Content

图片轮播的小案例

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>图片轮播</title> <style> div{ width:700px; margin:0 auto; position:relative; } ul{ position:absolute; bottom:0px; left:220px; } li{ width:15px; heig

基于mogileFS搭建分布式文件系统--海量小文件的存储利器

一.分布式文件系统    1.简介 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.分布式文件系统的设计基于客户机/服务器模式.一个典型的网络可能包括多个供多用户访问的服务器.另外,对等特性允许一些系统扮演客户机和服务器的双重角色.例如,用户可以"发表"一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样. 当下我们处在一个互联网飞速发展的信息社会,在

【安卓笔记】切换图片(底部带有小点效果)

下面我们要实现这样的效果: 我们将采用两种方式实现这种效果: 1.使用ViewPager: 思路:ViewPager提供左右滑动图片操作的支持,下方小点在代码中动态创建,整个布局采用FrameLayout. 先看布局: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" and

html中图片自适应浏览器,宽度高度自适应,图片自适应屏幕的小而不是宽高固定不变

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Show.aspx.cs" Inherits="Wlxxs.Web.Xxs.Show" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/x

js之图片变大变小效果

1.当鼠标移到图片上,图片变大:当鼠标移出图片,图片变小,效果如图: 2.原理不难,就是鼠标over时,设置一个定时器,让图片逐渐变大,鼠标out时同理,看下最初的简略代码你就会明白: <!DOCTYPE html> <html> <head> <style type="text/css"> div {     width: 200px;           /* 宽度 */     height: 100px;          /* 

职场办公必备:快速将图片转文字的小技巧

相信办公中或者学习中的小伙伴们经常会遇到这样的问题,有时候需要将图中文字提取应用到别的地方去,但是手动输入图中文字的效率太低了,不建议大家这样去做,那有什么好的方法呢?接下来,小编就来为大家分享一种快速将图片转文字的方法,超实用的哦! 辅助工具:迅捷OCR文字识别软件 使用具体文字识别软件的方法适用于那些在办公或者学习中经常处理到文字图片需要进行识别转换的朋友,工具在手,就可以方便随时实现转换了,下面一起来看看具体的操作步骤吧. 第一步.打开电脑中的OCR文字识别软件,关闭弹窗点击界面上方图片局

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

原文:8天入门docker系列 -- 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署 这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook 总要和一些数据库打交道吧,比如说mysql,mongodb,redis,通常情况下这些存储设备要么是以容器的方式承载,要么是由DBA在非容器环境下统一管理. 一:webnotebook连接容器redis

JPG图片怎么转换成PDF,批量图片转PDF的小技巧

在工作中经常会遇到文件转换的问题,但很多人都不知道JPG图片怎么转换成PDF,每次遇到这样的问题就很头疼,那么今天就来为大家说说这个问题,如果是要转换的文件太多,那就需要批量图片转PDF,那么批量图片转PDF的小技巧,下面就来为大家介绍. 1.小编下面介绍的PDF转换器转换质量高,功能丰富,是办公中必不可少的工具.分享的工具可以到百度上面搜索关键词PDF转换器,查找工具的安装网址,进行下载和安装.PDF转换器http://www.xjpdf.com/?2.安装到桌面上以后,进入软件首页面,点击上