php 表格设计,上传表如何设计

## 上传表如何设计

>[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值