目前负责的一个项目,图片存储方式是将上传的图片存储在数据库中。这种存储方式造成的最直接影响就是,导致数据库数据文件过大基本无法备份,对数据库的性能也有很大的副作用,图片写入和读取的速度也是慢的惊人。有了问题就得修改,网上查了一通资料,结合项目的实际情况定下来一个方案。因为使用的是windows平台,项目的开发环境是.net,于是决定采用wcf进行图片上传,图片以文件形式存储在服务器上,采用iis发布上传的图片。

上传流程:各种终端采集图片——>上传到网站应用程序——>网站应用程序调用wcf接口图片上传——>wcf将图片以文件形式存储在对应的图片服务器上,图片按日期和类别分文件夹存储

发布流程:在图片服务器上安装iis,新建虚拟目录指向图片存储的文件夹。终端(包括浏览器)请求图片——>网站应用程序调用wcf获取图片url接口——>将图片url返回给终端

部署方式:wcf部署在图片服务器上,和网站应用程序服务器在一个局域网内。

wcf服务代码:包括了上传图片,获取图片url,获取缩略图url,旋转图片4个接口。

// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract]
    public interface IPictureService
    {
        [OperationContract]
        void UploadPicture(RemoteFileInfo transferPic);

        [OperationContract]
        string GetPictureURL(string date, string depCode, string picName, out bool isExist);

        [OperationContract]
        string GetThumbPictureURL(string date, string depCode, string picName, out bool isExist);

        [OperationContract]
        void Rotate(string date, string depCode, string picName, string angle);

    }

    [MessageContract]
    public class ReturnInfo
    {
        [MessageHeader(MustUnderstand = true)]
        public string URL;
    }


    [MessageContract]
    public class RemoteFileInfo : IDisposable
    {
        /// <summary>
        /// 部门编码
        /// </summary>
        [MessageHeader(MustUnderstand = true)]
        public string DepCode;

        /// <summary>
        /// 日期,格式"20130808"
        /// </summary>
        [MessageHeader(MustUnderstand = true)]
        public string Date;

        /// <summary>
        /// 图片名称,与数据库图片表中的主键值相同,包括扩展名
        /// </summary>
        [MessageHeader(MustUnderstand = true)]
        public string PicName;

        /// <summary>
        /// 图片内容
        /// </summary>
        [MessageBodyMember(Order = 1)]
        public System.IO.Stream FileByteStream;

        public void Dispose()
        {
            if (FileByteStream != null)
            {
                FileByteStream.Close();
                FileByteStream = null;
            }
        }
  }

心得:

  1. 把获取图片url的接口放在wcf中,是为了将图片url生成的逻辑和业务系统分离,做改动更加方便。
  2. 文件实际存储的路径采用“盘符:\图片目录\日期\部门编号\图片文件名”的格式,以后若图片数据太多,可以将旧数据放到别的服务器上用iis或其他工具发布,wcf服务修改一下url的生成规则即可。
  3. 全部是.net平台的技术,.net程序员很容易搞定。
  4. 对于负载均衡和性能方面考虑的不多,目前项目够用,但对于高并发要求的系统,未必能达到要求。
posted on 2013-08-18 20:41  pengkun  阅读(734)  评论(0编辑  收藏  举报