目前负责的一个项目,图片存储方式是将上传的图片存储在数据库中。这种存储方式造成的最直接影响就是,导致数据库数据文件过大基本无法备份,对数据库的性能也有很大的副作用,图片写入和读取的速度也是慢的惊人。有了问题就得修改,网上查了一通资料,结合项目的实际情况定下来一个方案。因为使用的是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; } }
}
心得:
- 把获取图片url的接口放在wcf中,是为了将图片url生成的逻辑和业务系统分离,做改动更加方便。
- 文件实际存储的路径采用“盘符:\图片目录\日期\部门编号\图片文件名”的格式,以后若图片数据太多,可以将旧数据放到别的服务器上用iis或其他工具发布,wcf服务修改一下url的生成规则即可。
- 全部是.net平台的技术,.net程序员很容易搞定。
- 对于负载均衡和性能方面考虑的不多,目前项目够用,但对于高并发要求的系统,未必能达到要求。