七牛上传时候返回的有文件hash值,
七牛的 hash 算法是公开的。见: https://github.com/qiniu/qetag ,
如果你能够确认文件 <= 4M,
那么 hash = UrlsafeBase64([0x16, sha1(FileContent)])
则 hash = UrlsafeBase64([0x96, sha1([sha1(Block1), sha1(Block2), …])]),
其中 Block 是把文件内容切分为 4M 为单位的一个个块,也就是 BlockI = FileContent[I*4M:(I+1)*4M]
- 上传到七牛云存储的时候,key 是可选的。如果你不指定 key,则自动以 hash 值作为 key,此时自动带了消重能力。两个用户上传相同的文件,最终的 key 是一样的。
- 示例
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use Qiniu\Etag;
//qetag 是一个计算文件在七牛云存储上的 hash 值
use App\Models\Resource;
class ResourceController extends Controller
{
public function __construct(Resource $Resource)
{
$this->resource = $Resource;
}
/**
*
*/
public function getIndex()
{
return admin_view('resources.index');
}
/**
*
*/
public function postGoodsInfo(Request $Request)
{
$file = $_FILES['file'];
$qet = new Etag();
$hash = $qet->sum($file['tmp_name']);
dd($hash);
}
}
可以通过hash值判断,上传之后,数据库中维持一个hash字段,
然后计算hash值进行匹配,
这样在上传之前就可以知道七牛的bucket里有没有相同的hash已经存在了