winform 图片共享访问 怎么处理?

huoyanshan 2018-07-14 03:27:29
winform开发的客户端exe,需要在局域网多个电脑上安装,数据库安装在其中一台电脑上,都连一个数据库。
问题是,操作中每个exe都需要保存很多图片,A电脑保存的图片需要B电脑也能访问到,反过来也一样。
如果都存到数据库里,数据库压力好大。图片存本地,数据库只存路径,其他电脑的客户端怎么访问呢。

网上查到说有映射驱动器的办法,然后数据库保存图片路径。这种方式可行吗,会不会实际安装给客户的时候,如果因为网络原因或跨网段原因,一旦映射不上,那就麻烦了。

希望各位帮忙,有什么方式处理这种不同电脑图片需要共享访问的好办法。
...全文
238 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
要说明的是,所谓“数据库中存路径”是针对初学者开发一个小程序自己玩儿的时候,这个时候他最容易理解。你想想大程序的设计需求和维护就知道了,数据库中应该保存的是这类上传资源文件的 id(比如用 md5 签名也可以作为 id),而不是什么磁盘路径。
  • 打赏
  • 举报
回复
使用集中管理还是分布式管理,这是两类不同的设计思路。其中集中管理比较传统,可参考的方式多。比如说你随便写个 ashx 服务用来上传、下载文件就行了(根据资源文件的 id ——例如 guid 编码—— 上传下载,而不是在什么数据库里写地址)。

当然如果你有分布式的真正需求,或者特别想“跟别人不一样”,那么你使用一个分布式操作管理系统为基础,或者自己开发一个服务程序专门用来实现基本的分布式管理(100多行c#代码足矣),也可以。基本功能就是任何一个 Worker 服务器都能连上一个 Master 服务器,然后从 Master 服务器去查询某个 id 的资源文件的真实地址;而 Master 负责转发查询命令,以及负责管理查询反馈(最终转发给最初的 Worker),以及 Master 能处理到 Worker 的上线和下线甚至宕机的事件。


关于文件是否可以放到数据库中的问题,实际上像 SQL Server 这种数据库对文件也是可以自动优化的,使用 Binary(max) 之类字段来将文件保存到普通业务记录中是可以的,这类字段的操作据说不会出现反复在日志中,所以对性能影响不大。好处是可以在数据库备份时直接打包带走。

当然直接放到磁盘文件系统中管理也是可以的。比如说你可以在 asp.net 应用的 app_data 目录下创建一个资源文件目录,里边按照这类资源的 id 为文件名保存二进制文件。
mirrorspace 2018-07-15
  • 打赏
  • 举报
回复
"简单的定好资源文件在哪一个目录,这个倒没问题",比如,IMG文件,定在 /img/目录下.
但是,里面的子目录要在放资源的时候才确定, 这就不好办了,如,/img/20180715/a.jpg 这种随日期建立的目录.
在按ID取的时候,怎么知道这个a.jpg是存在于img目录下的20180715目录?

引用 9 楼 sp1234 的回复:
“全盘查找”?

设计服务的时候,先定好规范,先定好资源文件存在哪一个目录。在一个小功能上尚且不能按工程规范来先设计后施工,那么劳民伤财,是不是经常把3个月的项目做成2年都做不完的项目呢?
  • 打赏
  • 举报
回复
在资源文件管理中,每一个客户端,都需要把资源文件传给服务系统统一管理。如果你都没有这个流程,那么就知道做小玩具程序靠拼凑了。
  • 打赏
  • 举报
回复
“全盘查找”?

设计服务的时候,先定好规范,先定好资源文件存在哪一个目录。在一个小功能上尚且不能按工程规范来先设计后施工,那么劳民伤财,是不是经常把3个月的项目做成2年都做不完的项目呢?
mirrorspace 2018-07-15
  • 打赏
  • 举报
回复
那么根据这个ID如何查找文件呢?
在不知道地址的情况下,是全盘查找这个ID的文件?
这样一来,比直接知道地址的情况下,不是要多一个查找的过程吗
引用 7 楼 sp1234 的回复:
要说明的是,所谓“数据库中存路径”是针对初学者开发一个小程序自己玩儿的时候,这个时候他最容易理解。你想想大程序的设计需求和维护就知道了,数据库中应该保存的是这类上传资源文件的 id(比如用 md5 签名也可以作为 id),而不是什么磁盘路径。
threenewbee 2018-07-14
  • 打赏
  • 举报
回复
存入服务器上的文件系统。
大地主刘发财 2018-07-14
  • 打赏
  • 举报
回复
共享不靠谱,一大堆问题。数据库存少量还行,多了很坑, 还是推荐用HTTP或FTP服务器。或者是每台机器的EXE运行时监听一个端口,生成个本机的名字然后把名字和IP放到数据库里,存图片的时候路径中加上机器名例如pc-xxxx|d:\img\1.png这样,需要下载的时候到数据库中取出机器名对应的IP,SOCKET解决,这样更麻烦了。。
raynors 2018-07-14
  • 打赏
  • 举报
回复
EXE程序开始的时候就会判断位置是否可以访问,不可访问直接退出了,意味着服务器连不上,数据库也崩了。

至于文件传输,做FTP服务器 或者 HTTP啊。百度一搜一大把.

映射驱动器是走的文件夹共享,第一不太安全,第二不是正儿八经的做程序的方法

我自己是做局域网文件管理,走的文件夹共享。简单的共享到不是什么难事。直接用NET USE 拼接指令之类的就可以了。
raynors 2018-07-14
  • 打赏
  • 举报
回复
我当初考虑的是图片会更新,怎么分发的问题,所以我的做法是数据库存 位置,图片是用下载的方式完成缓存。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧