ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 上传表如何设计 >[info] 我们希望将每次上传的文件记录在表中,这样有很多作用,比如根据 MD5/HASH 实现图片上传时的去重,还可以用在业务字段中,很方便,管理上传资源也会很方便。 但是这样的一张表要如何设计呢? 我们先来看基本的上传文件URL **上传文件 URL如何存储?** ``` https://img30.360buyimg.com/n0/s616x405_jfs/t3856/64/1821196656/118766/f30bddd8/5899ac63N2b32c298.jpg 这是京东的用户晒图图片地址 http://yuanchuan.tenpower.club/uploads/20170331/20853c0d06e363d7509825a80e9846b6.jpg 这是礼品平台的图片上传地址 ``` **其实可分为** ``` 协议 + 主机 + 域名 + 业务目录 + 上传时产生的动态目录 [ https:// ] + [ img30. ] + [ 360buyimg.com/ ] + [ n0/s616x405_jfs/ ] + [ t3856/64/1821196656/118766/f30bddd8/5899ac63N2b32c298.jpg ] [ http:// ] + [ yuanchuan. ] + [ tenpower.club/ ] + [ uploads/ ] + [ 20170331/20853c0d06e363d7509825a80e9846b6.jpg ](这部分也是目前我们数据库中存的部分) 京东那个图片是动态的 https://img30.360buyimg.com/n0/s616x45_jfs/t3856/64/1821196656/118766/f30bddd8/5899ac63N2b32c298.jpg 可以改变大小 ``` **可以知道这部分是动态的,应该不会存** ``` 还要也要考虑CDN,一张图片分发到什么机器上去了 (想错了,CDN是自动的,并不会要求改变网址,所以网址应该是固定的) ``` **那么结论:** 需要存: 能代表这个文件的真是地址的url也就是 主机和包含路径的文件名 即 ``` 还是: 协议 + 主机 + 域名 + 业务目录 + 上传时产生的动态目录 ``` 但是为了灵活性,比如业务目录调整啊,网址变更啊,所以这些应分开存在不同的字段中 ``` 完整URL = 协议 + 主机 + 域名 + 业务目录 + 上传时产生的动态目录 url = agreement + host + domain + business_directory + file ``` **那么我们设计的表应该是:** 表名:`tb_uploads` | 字段名 | 说明 | | --- | --- | | id | 自增ID | | agreement | 协议 | | host | 主机 | | domain | 一级域名 | | business_directory | 业务目录 | | file | 动态文件地址 | | create_time | 创建时间 | | create_ip | 创建IP | | user_id | 用户ID,默认0表示上传者未登录(不过由于去重机制,这只是第一次上传此文件的用户ID,实际上由于去重,此表也只会记录第一个上传信息) | | md5 | 文件MD5 | | hash | 文件HASH | | size | 文件大小 | | width| 图片高度(仅图片文件有这个值) | | height| 图片高度(仅图片文件有这个值) | *(根据业务逻辑还可以划分出一个附件表)* * * * * * ### 扩展 **获取图片的url可访问地址** ~~~php /** * 默认可以压缩上传的文件 * 对上传文件显示前进行的url转换/处理 * 如果是有协议的 http:// https:// …… 或者 不限协议 //url 这样的 直接返回 * 如果是 / 以 域名为顶级 的 给加上域名即可 * 否则和 config('uploads_url') 拼接 * @param string $value 待处理的地址 * @return string 处理后的地址 */ function media($value, $max_quality = 60) { $void = Request::instance()->root(true) . '/static/images/void.jpg'; if ($value == '') { return $void; } if (strpos($value, '://') || 0 === strpos($value, '//')) { return $value; } if (0 === strpos($value, '/')) { return Request::instance()->domain() . $value; } // 那么就是上传图片了 if (!file_exists(config('base_uploads_path') . $value)) { return $void; } return config('uploads_url') . getSmallImg($value, $max_quality); } ~~~ last update :2017-6-1 10:51:39