码迷,mamicode.com
首页 > Web开发 > 详细

.Net简单图片系统-简介

时间:2015-08-29 16:37:43      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

.Net图片系统就是 一个独立的图片站点,上传的的图片将被保存到站点本地文件系统或者基于fastdfs的分布式文件系统中,图片在查看时会直接请求此站点或者fastdfs的tracker服务器(需要nginx支持)。 
 
如今一些系统都会提供图片上传功能,但是不同的系统,保存图片的方式也不尽相同。 
1. 保存到站点内:上传的图片被保存到了站点目录下面,这种方式适合单系统或者简单多系统,实现方式简单,但是如果访问量大,图片请求就会占用网络和磁盘资源而影响网站本身的性能。
     1. 单系统  系统只有一个,图片上传后存储在系统目录下,页面通过 http://xx.com/uploadimage/20150808101203.jpg 这种方式访问。
     2. 简单多系统  系统一般会有2个或者3个,比如有一个前台系统,一个后台系统,后台系统发布新闻公告并上传图片到系统目录,前台系统查看,因为这两个系统并不在一个域名下面,所以前台系统要访问后台系统上传的图片,需要直接引用后台系统地址,例如在前台系统(http://www.xx.com)中需要通过http://admin.xx.com/image/20150808101203.jpg 的方式访问。
 
2. 保存到独立图片服务:图片被上传到独立的图片服务器上,图片服务器可以是单台,也可以是多台。 
    1. 单台  图片都上传到一台图片服务器上,但是如果图片服务器宕机,则会影响网站所有的图片访问,如果是磁盘损坏,则造成的损失可能是永久性的。并且如果访问量大, 也可能会造成瓶颈。
    2. 多台  用多台服务器保存图片,每台服务器的图片都是相同的,前端通过负载均衡来选择任意一台,可以很好的解决宕机,磁盘损坏以及大量访问带来的问题,缺点是多台图片服务器要做同步,如果服务器较多,多台服务器的相互同步也是一个问题。
 
3. 保存到分布式文件服务器:本质上也是多台服务器,只是对多台服务器的磁盘进行了统一的管理。
   1. 采用分布式的文件系统(FastDFS、HDFS、MogileFs、MooseFS、TFS等)来存储图片,在多台机器的基础上,提供了一个管理抽象层,可以很好解决多台服务器带来的相互同步问题。 
 
4. 保存到CDN网络:
    1. 以上几种方式都是将图片保存到了服务端,CDN网络可以将图片保存到离用户较近的地方,缩短传输距离。但是即使用了CDN,服务端也要用独立图片服务器或者分布式图片服务器,因为CDN有可能回源请求。并且并不是所有的图片都适合存放在CDN上,对于那些动态请求显示的图片还是需要放在服务端,比如用户头像。
 
1. 对于保存在站点内的方式,通常是在页面上放一个<input type=‘file‘>的标签,提交时将这些信息统一提交到后台,后台方法中通过如下的方式保存到本地。 
技术分享
 var request = System.Web.HttpContext.Current.Request;
var file = request.Files[0];
 
string localPath = Path.Combine(HttpRuntime.AppDomainAppPath,"Upload");
string ex = Path.GetExtension(file.FileName);
string filePathName = Guid.NewGuid().ToString("N") + ex;
if (!System.IO.Directory.Exists(localPath))
{
     System.IO.Directory.CreateDirectory(localPath);
}
 file.SaveAs(Path.Combine(localPath, filePathName));  
View Code
 
2. 对于独立的图片服务器, 我们需要将接收到的图片重新上传到图片服务器。 图片服务器可以可以采用IIS , 也可以采用Nginx。
   IIS服务器参考http://www.cnblogs.com/edisonchou/p/4137134.html,非常实用,不过从安全的角度来说,还应该对图片服务器保存的图片进行备份,或者服务器的磁盘采用RAID1或者RAID5。
   nginx服务器的搭建参考http://www.cnblogs.com/Alight/p/3306624.html,这篇文章推荐了两种方式, 第一种直接将图片服务器的磁盘映射到本地,这种方法不用再开发图片服务器的接收端,但是映射的稳定性和性能还有待考虑,第二种方法是将图片发送到任意一台图片服务器上,多台服务器相互同步,解决了备份问题,再通过负载均衡对外提供服务,也避免了单台磁盘和网络瓶颈问题。 
 
3. 分布式图片服务器
   图片将保存在分布式文件系统中, 比如FastDFS、HDFS、MogileFs、MooseFS、TFS等,因为分布式文件系统本身对文件进行了备份,所以不存在同步问题。
 
4. CDN网络
    CND一般都是采用商用的, 当然像淘宝那样的,因为访问量太大, 据说是自建CDN。 
 
当系统越来越多,系统中的图片也会越来越多,出于各方面的考虑,就需要一个独立的图片服务器。同时每当有一个上传图片的功能,就需要将file.SaveAs(Path.Combine(localPath, filePathName));这段代码再copy一次,并且如果没有做强制要求,大家对文件的命名规则也不相同。基于这种情况,我准备开发一套自己的图片系统,首先这个系统是一个独立的服务站点,可以将图片统一上传到这台服务器上,上传的图片可以保存到服务器本地磁盘,也可以保存到分布式文件系统中。同时,图片的上传保存功能将不再耦合在业务站点中,而是在页面前端直接通过CORS上传到图片服务器上,图片服务器返回图片的绝对地址(http://image.xx.com/uplaod/11XX.jpg ),最后这个地址再随其他信息一起提交到业务站点,当信息被展示的时候,图片直接请求http://image.xx.com/uplaod/11XX.jpg 。 
 
开发语言为C#。
开发工具包括Visual studio 2013, fastdfs, nginx,webuploader。
基本适用于所有的web站点。
项目开源, 已托管在https://github.com/zhaoyb/ImageServices/ 。
 
1. 用户选择要上传的图片,图片不经过业务服务器,而是直接通过CORS的方式上传到图片服务器。
2. 图片服务器将上传的图片保存到本地或者FastDFS中,返回保存的图片地址。 
3. 图片地址随业务数据一起被提交到了业务站点。 
4. 用户浏览业务数据。
5. 如果业务数据中含有图片, 则直接请求图片服务器或者tracker服务器。
6. tracker服务器会请求storage服务器获取图片。 
 
1. 除了将图片服务器架构在IIS上,如果有条件,可以将图片服务器架构在nginx上, 并开启缓存模块和zero copy模式。当然开发语言需要改为Java或者php。
2. 实现了基本的上传保存功能,但是对图片不同尺寸剪裁, 压缩, 加水印,防盗链等还没有实现。 
3. 本文说的是图片服务器, 但是对于小型的文件上传也可以采用这种方式 。 
 
 

.Net简单图片系统-简介

标签:

原文地址:http://www.cnblogs.com/beyondbit/p/4763990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!