Download the PHP package ddvphp/ddv-file without Composer
On this page you can find all versions of the php package ddvphp/ddv-file. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package ddv-file
ddv-file
Installation - 安装
- [客户端] 代指 IOS 安卓 Html5 flash
- [device_type] 目前允许
ios
android
html5
htmlswf
html4
wxmp
- 微信公众平台的浏览器一定要使用
wxmp
,不建议使用html5
- 否则会导致部分手机上传失败,因为微信浏览器的限制导致分块的计算公式不一样
一、客户端使用
1、获取分块大小
首先客户端[IOS 安卓 Html5 flash]获取文件大小, 调用一下接口,获取到分块大小以及总分块数
- ==服务户端计算规则==
- 定义
$part_size_min = 400*1024
;- 定义
$part_size_max = 15*1024*1024
;- 计算
$part_size = ceil(max($file_size/1000 , $part_size_min))
- 判断
$part_size
如果大于$part_size_max
抛出异常 暂时不能上传大于15G的文件- 计算
$part_sum = ceil($file_size/$part_size)
- 判断
$part_sum
如果大于1000
抛出异常 可以等于1000
暂时不能上传大于15G的文件因为我们的服务器目前设定最大接受上传15G 另外分块太大也给移动端带来压力
分块大小计算 是 取大原则
向上去整
- ==服务户端计算规则==
请求地址:v1_0/upload/filePartSize
使用说明:获取分块大小
需要登录:是
请求方法:GET
数据形式:x-www-form-urlencoded 、form-data
发送以下信息到服务器
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fileSize | int | 是 | 文件大小。 |
fileType | string | 是 | 可以参考Mime 类型列表 未知类型为 application/octet-stream |
deviceType | string | 是 | 设备类型 ios android html5 htmlswf html4 wxmp |
样板数据
返回结果
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
partSize | int | 是 | 切片大小。 |
partSum | int | 是 | 切片总块数。 |
样板数据
2、获取文件id
- 前端读流方式计算文件的相关信息
- 以partSize的大小进行流式读取文件
- 计算文件的总内容的md5为fileMd5
- 计算文件的总内容的sha1为fileSha1
- 计算文件的总内容的crc32为fileCrc32
- 计算当前每一块的流的二进制的md5的hex值 并且拼接为partMd5Str
- 比如第一块的md5是 0fdf5be93cd24aeeaccb046406c3a643
- 比如第二块的md5是 986f5be93cd24ae9accb047776c3a332
- 比如第三块的md5是 85658be93cd24aeeaccb046406c3a757
- 使用partMd5Str = partMd5Str + {上一块md5}
- 那么partMd5Str是0fdf5be93cd24aeeaccb046406c3a643986f5be93cd24ae9accb047776c3a33285658be93cd24aeeaccb046406c3a757
- partMd5Str随着分块累计不停变长,但是*不会超过 100032=32000字节**
- 最后 得到 md5、sha1、crc32
- 还有 filePartMd5Lower = md5(partMd5Str[转小写]) + '-' + partSum
- 还有 filePartMd5Upper = md5(partMd5Str[转大写]) + '-' + partSum
- 得到 filePartMd5Lower为4CF26963D7C141DEFBC985382538B43F-3
- 得到 filePartMd5Upper为BB49107DFF0A0054DC67D94B1FFC5A24-3
请求地址:v1_0/upload/fileId
使用说明:获取分块大小
需要登录:是
请求方法:GET
数据形式:x-www-form-urlencoded 、form-data
发送以下信息到服务器
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fileMd5 | string | 是 | 文件md5[Hex][大写Hex结果]。 |
fileSha1 | string | 是 | 文件sha1[Hex][大写Hex结果]。 |
fileCrc32 | string | 是 | 文件crc32[Hex][大写Hex结果]。 |
filePartMd5Lower | string | 是 | 多块小写md5的md5[大写Hex结果]。 |
filePartMd5Upper | string | 是 | 多块大写md5的md5[大写Hex结果]。 |
fileName | string | 是 | 文件名称[带扩展名]。 |
fileSize | int | 是 | 文件大小[字节数]。 |
fileType | string | 是 | 可以参考Mime 类型列表 未知类型为 application/octet-stream |
lastModified | int|float | 是 | 文件最后修改时间[时间戳,到秒,可以带小数]。 |
manageType | string | 是 | 权限类型[admin|user]。 |
directory | string | 是 | 目录[默认common/other]。 |
deviceType | string | 是 | 设备类型 ios android html5 htmlswf html4 |
authType | string | 否 | .......具体看后台应用的业务需要 |
样板数据
返回结果
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fileId | string | 是 | 文件id。 |
fileCrc32 | string | 是 | 文件crc32。 |
fileMd5 | string | 是 | 文件md5。 |
fileSha1 | string | 是 | 文件sha1。 |
url | string | 是 | 文件如果成功上传后的url。 |
path | string | 是 | 文件如果成功上传后的path。 |
isUploadEnd | boolean | 是 | 是否已经成功上传。 |
样板数据
如果
isUploadEnd
已经成功上传就跳过下列所有步骤
3、获取成功上传的信息
请求地址:v1_0/upload/filePartInfo
使用说明:获取成功上传的信息
需要登录:是
请求方法:GET
数据形式:x-www-form-urlencoded 、form-data
发送以下信息到服务器
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fileId | string | 是 | 文件id。 |
fileMd5 | string | 是 | 文件md5[Hex][大写Hex结果]。 |
fileSha1 | string | 是 | 文件sha1[Hex][大写Hex结果]。 |
fileCrc32 | string | 是 | 文件crc32[Hex][大写Hex结果]。 |
样板数据
服务器返回
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fileSize | int | 是 | 文件大小。 |
partSize | int | 是 | 分块大小。 |
partSum | string | 是 | 总的分块个数。 |
doneParts | array | 是 | 成功上传的数组。 |
isUploadEnd | boolean | 是 | 是否已经成功上传。 |
样板数据
客户端从1
开始循环到{partSum}
切块 执行4、获取分块签名
的步骤 跳过doneParts
的成功上传块
服务在这个时候建立uploadid 并且查询成功上传的块信息 如果是第一次产生的uploadid 块信息doneParts为空数组 如果有uploadid就查询阿里云或者百度云的done_parts信息
注意 如果
isUploadEnd
已经成功上传就跳过下列所有步骤
4、获取分块签名
请求地址:v1_0/upload/filePartMd5
使用说明:获取成功上传的信息
需要登录:是
请求方法:GET
数据形式:x-www-form-urlencoded 、form-data
发送以下信息到服务器
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fileId | string | 是 | 文件id。 |
fileMd5 | string | 是 | 文件md5[Hex][大写Hex结果]。 |
fileSha1 | string | 是 | 文件sha1[Hex][大写Hex结果]。 |
fileCrc32 | string | 是 | 文件crc32[Hex][大写Hex结果]。 |
partNumber | int | 是 | 当前分块的序号,第几块。 |
partLength | int | 是 | 当前分块的字节数,分块的大小或者最后一块大小。 |
md5Base64 | string | 是 | 文件的md5的二进制值进行base64参考这个说明。 |
deviceType | string | 是 | 设备类型[ios android html5 htmlswf html4 ]。 |
isHeaderArray | string | 否 | 是否传回数组头[默认:flase ]。 |
样板数据
服务器返回
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
url | string | 是 | 分块数据请求发送地址。 |
method | string | 是 | 分块数据请求发送方式。 |
headers | array | 是 | 分块数据请求头。 |
样板数据
因为头的key的特殊性 传参可以带
isHeaderArray
=true
来得到数组头
5、获取成功上传的信息
请求地址:v1_0/upload/complete
使用说明:获取成功上传的信息
需要登录:是
请求方法:POST
数据形式:x-www-form-urlencoded 、form-data
发送以下信息到服务器
属性 | 类型 | 是否必填 | 说明 |
---|---|---|---|
fileId | string | 是 | 文件id。 |
fileMd5 | string | 是 | 文件md5[Hex][大写Hex结果]。 |
fileSha1 | string | 是 | 文件sha1[Hex][大写Hex结果]。 |
fileCrc32 | string | 是 | 文件crc32[Hex][大写Hex结果]。 |
样板数据
服务器返回有 空数组代表成功,如果抛出异常就看一下是否为漏切片
二、服务器使用
我们以
laravel
框架为样本使用
我们以laravel提供一个样本
==服务户端计算规则== 定义
$partSizeMin = 400*1024
; 定义$partSizeMax = 15*1024*1024
; 计算$partSize = ceil(min(fileSize,max(ceil(fileSize/$partSumMax),$partSizeMin)))
判断$partSize
如果大于$partSizeMax
抛出异常 暂时不能上传大于15G的文件 计算$partSum = ceil($fileSize/$partSize)
判断$partSum
如果大于1000
抛出异常 可以等于1000
暂时不能上传大于15G的文件因为我们的服务器目前设定最大接受上传15G 另外分块太大也给移动端带来压力
分块大小计算 是 取大原则
向上去整
==服务户端计算规则==
1、路由初配置
2、控制器文件Api\UploadController
2.1、 配置初始化
2.2、获取分块大小 接口
2.3、获取文件id 接口
2.3、获取成功上传的信息
2.4、获取分块签名
2.5、合并上传文件
All versions of ddv-file with dependencies
paragonie/random_compat Version ^2.0
ddvphp/ddv-exception Version 0.0.*
aliyuncs/oss-sdk-php Version ~2.0