请教大神:怎么设计一个较好的保存上传图片的表?
在没有用第三方储存时,我们项目的图片上传做了一个表,如上图,用在图片上传模型的地方可以做到图片去重,url
列保存的是图片的地址Uploads/Pic/2016-06-15/5760a0ed1d994.png
,而实际*问地址是 www.xxx.com/Uploads/Pic/2016-06-15/5760a0ed1d994.png
这个地址可以拆分为:Uploads/Pic/
和 2016-06-15/
和 5760a0ed1d994.png
即:服务器相对目录
, 动态目录
, 动态文件名
我们所有的图片上传都用了这个上传模型,上传去重后感觉比较高效,我们商品主图直接放的是这个表的id
,一直以来这个设计感觉还行,可是现在问题来了:
1:首先URL
这里所有的图片放在网站访问目录下面,这对于有的版权保护图片来说就不合适了。
2:我们现在是单台服务器,这个url
读出来后前面加个网址或者web
访问根目录“/”
就可以了,但是如果有多台服务器那么就不好办了。(明显这种设计有问题,只是一开始没意识到)
3:如果此时我们用了第三方图片储存的话,那么之前的商品主图用这个图片表的id
这种设计岂不是就土崩瓦解了,如果我们用第三方后,那么商品表的主图字段存的是什么呢,是七牛的图片访问地址吗?
补充:
https://fuss10.elemecdn.com/e/bb/631e55d8cd93dab03a687807900c1jpeg.jpeg?imageMogr2/thumbnail/70x70/format/webp/quality/85
看到这个地址,我发现问题二似乎有救,那就是在抽一层“目录”出来——https://fuss10.elemecdn.com/
(主机目录/资源目录
),哎,也只是突然想到,没有思路,这样的话如果主机变动的话也完蛋了,想的脑壳疼了。
我甚至还想给这个表加上图片尺寸,大小的字段,exif信息字段,不知道可不可以。
希望有经验的大神给我点思路,谢谢了^_^
回复内容:
在没有用第三方储存时,我们项目的图片上传做了一个表,如上图,用在图片上传模型的地方可以做到图片去重,url
列保存的是图片的地址Uploads/Pic/2016-06-15/5760a0ed1d994.png
,而实际*问地址是 www.xxx.com/Uploads/Pic/2016-06-15/5760a0ed1d994.png
这个地址可以拆分为:Uploads/Pic/
和 2016-06-15/
和 5760a0ed1d994.png
即:服务器相对目录
, 动态目录
, 动态文件名
我们所有的图片上传都用了这个上传模型,上传去重后感觉比较高效,我们商品主图直接放的是这个表的id
,一直以来这个设计感觉还行,可是现在问题来了:
1:首先URL
这里所有的图片放在网站访问目录下面,这对于有的版权保护图片来说就不合适了。
2:我们现在是单台服务器,这个url
读出来后前面加个网址或者web
访问根目录“/”
就可以了,但是如果有多台服务器那么就不好办了。(明显这种设计有问题,只是一开始没意识到)
3:如果此时我们用了第三方图片储存的话,那么之前的商品主图用这个图片表的id
这种设计岂不是就土崩瓦解了,如果我们用第三方后,那么商品表的主图字段存的是什么呢,是七牛的图片访问地址吗?
补充:
https://fuss10.elemecdn.com/e/bb/631e55d8cd93dab03a687807900c1jpeg.jpeg?imageMogr2/thumbnail/70x70/format/webp/quality/85
看到这个地址,我发现问题二似乎有救,那就是在抽一层“目录”出来——https://fuss10.elemecdn.com/
(主机目录/资源目录
),哎,也只是突然想到,没有思路,这样的话如果主机变动的话也完蛋了,想的脑壳疼了。
我甚至还想给这个表加上图片尺寸,大小的字段,exif信息字段,不知道可不可以。
希望有经验的大神给我点思路,谢谢了^_^
1:首先URL这里所有的图片放在网站访问目录下面,这对于有的版权保护图片来说就不合适了。
版权保护,这块指的是?防盗链么?还是防下载什么的。七牛无论是防盗链还是token的下载权限验证什么的都支持的。应该是可以满足你这个需求
2:我们现在是单台服务器,这个url读出来后前面加个网址或者web访问根目录“/”就可以了,但是如果有多台服务器那么就不好办了。(明显这种设计有问题,只是一开始没意识到)
你都发在七牛这边了,所以根本不需要考虑这个问题。一个图片域名搞定所有。程序的配置里面写好这个域名就好了。
3:如果此时我们用了第三方图片储存的话,那么之前的商品主图用这个图片表的id这种设计岂不是就土崩瓦解了,如果我们用第三方后,那么商品表的主图字段存的是什么呢,是七牛的图片访问地址吗?
七牛有个Etag的,也有明确的算法,可以用于去重,每张图有唯一的Etag,你可以用这个当你原来的ID存。
补充~~你写的都是相对路径,所以不要担心换主机什么的。用第三方,域名区别就行了。
如果你想自建,那可以利用一致性Hash等方案去做主机区分。。当然。这个架构你可以参考淘宝的。比较完善
谢邀,点赞,加油。
码农不会考虑你这种问题,因为没有意识。经验多了也不会考虑这种问题,因为已经考虑过了。所以你在前进的路上。
首先来说,图片没有必要去重,因为
1-作为商品管理员在没有误操作的情况下不会为一个商品上传两个相同的图片
2-商品不同的时候就算其图片是一样的也不需要去重,因为从根本来说这是不同的商品,应该使用不同的图片,可能由于某些原因现在用了相同的,但是不排除以后修改的可能,而你进行了去重处理,可能导致不同商品使用相同图片id,那某个商品需要单独更新其对应图片怎么办呢?能解决,但是没有价值。
其次,图片访问问题,其实不重要,想盗图你其实防不住,防盗链简单说就是当接到资源请求时(如css, js, image等)web服务器检查一下来路,比如必须是从xxx域名发起的,否则为盗链。不过用途不是很大,自己找资料配置一下服务器应该就能实现。
最后,使用远端会带来什么影响?除图片保存位置变化以外无影响。你这个表还是必要的,只是url字段存储的值是远端地址而已。至于md5和sha1的摘要值确实没用。
这是我用七牛的时候使用的数据表,供参考
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`json_detail` text, //七牛响应信息
`parent_id` int(11) unsigned DEFAULT NULL, //生成的缩略图也要记下来,缩略图需要指明根据哪个图片来的
`etag` varchar(64) NOT NULL, //实体标识(应该是七牛用来去重的)
`src` varchar(255) NOT NULL, //远端地址
`action_type` varchar(16) NOT NULL, //对应的七牛空间
`mime_type` varchar(64) DEFAULT NULL,
`filesize` bigint(20) unsigned DEFAULT NULL,
`key` varchar(192) NOT NULL, //唯一标识
`original_filename` varchar(192) DEFAULT NULL,
`width` int(11) DEFAULT NULL, //图片宽
`height` int(11) DEFAULT NULL, //图片高 优化浏览器对图片的显示
`extension` varchar(8) DEFAULT NULL,
`format` varchar(16) DEFAULT NULL,
`created_at` int(11) unsigned NOT NULL,
`main_color` char(8) DEFAULT NULL, //图片的主色,七牛功能
`user_id` int(11) unsigned DEFAULT NULL,
尤其对于商城来说,我们更关注:
1- 图片是否可用
2- 图片大小是否合适(通常商城总是显示图片的缩略图而不是原图,为了速度考虑,很重要)
3- 显示调优,标记包含高宽值的时候在浏览器中渲染的更快
4- 图片文件同步删除
上一篇: php 的反射详解及示例代码