laravel提供了方便快捷的文件操作,与遇到第三方文件服务器,例如阿里云,七牛云等等如何处理上传的文件,下面案例是使用七牛云案例。
在laravel使用:
1,首先我们需要下载七牛云sdk,定义qiniuyun类库,具体一些配置就不写了,相信使用过第三方文件服务器工具都应该知道原理,如下
<?php
namespace Services;
use Illuminate\Support\Facades\Config;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use Qiniu\Storage\BucketManager;
class Qiniu {
//访问 key
private $accessKey;
//密钥
private $secretKey;
private $bucket;
private $token;
private $err;
private $ret;
/**
* @var array 七牛域名 绑定
*/
private $qiniu_domain = array(
'product-images' => 'https://dn-yidd-product-images.qbox.me',
'article-images' => 'https://dn-yidd-article-images.qbox.me',
'avator-images' => 'https://dn-yidd-avator-images.qbox.me',
'drugstore-images' => 'https://dn-yidd-drugstore-images.qbox.me',
'id-images' => 'https://dn-yidd-id-images.qbox.me',
'ue-images' => 'https://dn-yidd-ue-images.qbox.me',
'topic-images' => 'https://dn-yidd-topic-images.qbox.me',
'slide-images' => 'https://dn-ydd-slide-images.qbox.me',
'test-paper-images' => 'https://dn-ydd-test-paper-images.qbox.me',
'event-images' => 'https://dn-yidd-event-images.qbox.me',
'audio' => 'https://dn-yidd-audio.qbox.me',
'video' => 'https://dn-yidd-video.qbox.me',
'group-images' => 'https://dn-yidd-group-images.qbox.me',
);
/**
* @param $bucket 七牛空间名称
* @param bool $require_auth 是否需要权限
*/
public function __construct($bucket,$require_auth = false){
$this->bucket = $bucket;
if($require_auth){
$this->accessKey = Config::get('config.access_key');
$this->secretKey = Config::get('config.secret_key');
$this->auth = new Auth($this->accessKey, $this->secretKey);
$this->token = $this->auth->uploadToken($this->bucket);
}
}
/**
* @param $key 唯一存储名称
* @param $filePath 本地上传文件路径
*/
public function upload($key, $filePath){
$uploadMgr = new UploadManager();
list($ret, $err) = $uploadMgr->putFile($this->token, $key, $filePath);
if ($err !== null) {
$this->err = $err;
} else {
$this->ret = $ret;
$this->DeleteLocalImage($filePath);
return true;
}
}
/**
* 删除
* 唯一存储名称
* @param $key
*/
public function delete($key){
$bucketMgr = new BucketManager($this->auth);
$err = $bucketMgr->delete($this->bucket, $key);
if ($err !== null) {
return false;
} else {
return true;
}
}
/**
* @param $key 唯一存储名称
* @return string
*/
public function getFileUrl($key){
return $this->qiniu_domain[$this->bucket].'/'.$key;
}
/*
* 获取存储空间https地址
*
*/
public function getDomain(){
return $this->qiniu_domain[$this->bucket].'/';
}
/**
* 获取 token
* @return string
*/
public function getToken(){
return $this->token;
}
/**
* 返回错误
* @return mixed
*/
public function getErr(){
return $this->err;
}
/**
* 返回七牛返回值
* @return mixed
*/
public function getReturn(){
return $this->ret;
}
//删除本地图片
public function DeleteLocalImage($filePath){
$result = @unlink ($filePath);
return $result;
}
}
2,定义生成七牛云文件的命名规则的类库
<?php
namespace App\Services;
class Util{
private static $_instance;
public static function getUtilData(){
if(!self::$_instance){
self::$_instance = new Util();
}
return self::$_instance;
}
/**
* 七牛文件命令规则
1. 身份证:id_用户ID_时间戳.png
2. 头像:avatar_用户ID_时间戳.png
3. 药店营业执照:bl_药店名称_时间戳.png
4. 产品图片:product_产品ID_时间戳.png
5. 文章列表图片:artile_文章ID_时间戳.png
*
* * $id = 数据编号
* $type = 所代表的空间名称
*
*
* 4【'product'=>'产品图片'】id必传
* 5【'article'=>'文章图片'】id必传
* 8【'slide'=>'幻灯片'】 id 非必传
* 9【'test_paper'=>'题卷图片'】 id 必传
* 10【'event'=>'活动图片'】id必传
*
*
* @param $bucketType
* @param intval $id
* @param string $filename
* @return string
*/
public function create_qiniu_unqiue_name($bucketType,$id=false,$filename = ''){
$arr = [1=>'id',2=>'avator',3=>'drugstore',4=>'product',5=>'article',8=>'slide',9=>'test_paper',10=>'event'];
$name = $arr[$bucketType] ? $arr[$bucketType] : false;
if($name === false){
return false;
}
if($id === false){
$file_prefix = $name.'_';
}else{
$file_prefix = $name.'_'.$id.'_';
}
$ext = '';
if($filename != ''){
$ext = substr($filename,strrpos($filename,'.'));
}
list($u, $s) = explode(' ',microtime());
$s = date('ymdhis',$s);
$result = $s.($u* pow(10,2));
if(strpos($result,'.')){
list($result,$useless) = explode('.',$result);
}
$name = $file_prefix.$result.$this->getRandCode(6);
return $name.$ext;
}
/**
* 七牛文件命令规则 ---javascript web 上传命名规则
1. 身份证:id_用户ID_时间戳.png
2. 头像:avatar_用户ID_时间戳.png
3. 药店营业执照:bl_药店名称_时间戳.png
4. 产品图片:product_产品ID_时间戳.png
5. 文章列表图片:artile_文章ID_时间戳.png
*
* * $id = 数据编号
* $type = 所代表的空间名称
*
*
* 4【'product'=>'产品图片'】id必传
* 5【'article'=>'文章图片'】id必传
* 8【'slide'=>'幻灯片'】 id 非必传
* 9【'test_paper'=>'题卷图片'】 id 必传
* 10【'event'=>'活动图片'】id必传
* 13【'group'=>'群组头像'】id必传
*
*
* @param $bucketType
* @param intval $id
* @param string $filename
* @return string
*/
public function javascript_create_qiniu_unqiue_name($bucketType,$id=false){
$arr = [4=>'product',5=>'article',8=>'slide',9=>'test_paper',10=>'event',13=>'group'];
$name = $arr[$bucketType] ? $arr[$bucketType] : false;
if($name === false){
return false;
}
if($id === false){
$file_prefix = $name.'_';
}else{
$file_prefix = $name.'_'.$id.'_';
}
list($u, $s) = explode(' ',microtime());
$s = date('ymdhis',$s);
$result = $s.($u* pow(10,2));
if(strpos($result,'.')){
list($result,$useless) = explode('.',$result);
}
return $file_prefix.$result.$this->getRandCode(6);
}
/**
* 获取直定长度随机码
* @param type $length
* @param type $type 0 纯数字 1 数字、小写字母 2 数字、小写字母、大写字母
* @return string
*/
function getRandCode($length = 6,$type = 0)
{
if($type == 0) {
$str = '0123456789';
}else if($type == 1){
$str = '0123456789abcdefghijklmnopqrstuvwxyz';
}else{
$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
}
$len = strlen($str);
$retStr = '';
for($i=0;$i<$length;$i++){
$retStr .= $str[rand(0, $len-1)];
}
return $retStr;
}
}
3,好了,工具已经准备好了,我们开始吧,首先是新建一个html文件,当然laravel路由配置需要自己配置,在app\http\route.php中配置:
例如Route::any('User/add',['middleware'=>'auth','uses'=>'Backstage\User\UserController@add']);//新增会员
html中部分内容:
<form id="frm_add" name="frm_add" class="formbody" action="{{url('User/add')}}" method="post" enctype="multipart/form-data">
......
<li>
<span>头像</span>
<cite><input id="avatar" name="avatar" type="file"></cite>
</li>
.......
</form>
form提交过后,注:前端上传文件未做文件大小,类型作验证,有兴趣的,自己作验证,这里就在后端通过php代码进行验证了。
config中上传头像配置:
//上传头像文件的配置选项
'avatar' =>[
'size' => '2048000',
'extension' =>[
0 =>'jpg',
1 =>'jpeg',
2 =>'bmp',
3 =>'gif',
4 =>'png'
]
],
'bucket_key' => [
1 => 'id-images', //身份证
2 => 'avator-images', //头像
3 => 'drugstore-images', //药店营业执照
4 => 'product-images', //产品图片
5 => 'article-images', //文章图片
6 => 'topic-images', //话题图片章
7 => 'ue-images', //ueditor上传图片
8 => 'slide-images', //幻灯片
9 => 'test-paper-images', //题卷图片
10 => 'event-images', //活动图片
11 => 'audio', //音频
12 => 'video',// 视频
13 => 'group-images',// 群组头像
],
php代码:
控制器代码:
namespace App\Http\Controllers\Backstage\User;
use Illuminate\Http\Request;
use Services\Qiniu;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Facades\DB;
class UserController extends \App\Http\Controllers\Backstage\Controller {
.......
public function add(Request $request){
//实例化User模型对象,继承\Illuminate\Database\Eloquent\Model
$userLogic = new \App\Logics\UserLogic();
//判断是否是表单提交,所以在我们配置路由时候,路由的http请求方式不仅仅是get,而且也是post,参考
//laravel如何配置路由
if($request->isMethod('post')){
$temp_name = '';
$avatar_upload_path = '';
$path = "";
//判断表单提交是否含有文件操作
if($request->hasFile('avatar')){
//获取上传文件信息,返回结果集是一个对象,该对象可以获取到缓存在tmp文件夹中的文件
//名、上传文件的后缀、缓存在tmp文件夹下的文件的绝对路径、文件大小等等
$avatar = $request->file('avatar');
//get avatar config para
$avatar_config = config('config.avatar');
//判断上传文件格式是否合格
if(!in_array(strtolower($avatar->getClientOriginalExtension()),$avatar_config['extension'])){
show_message('上传文件格式错误,请重新上传!','goback',1000,0);exit;
}
//判断上传文件大小是否合格
if($avatar->getSize() > $avatar_config['size']){
show_message('上传文件过大,请上传不超过2M的文件!','goback',1000,0);exit;
}
//laraval 第三方扩展类库Filesystem,很强大,自行查询,laravel api文档
//https://laravel.com/api/5.0/Illuminate/Filesystem/Filesystem.html
$filesystem = new Filesystem();
//定义laravel项目中上传路径
$avatar_upload_path = public_path() . '/upload/avatar/';
//判断已定义的上传路径是否存在或者是否是不是只读,不符合条件我们创建该目录并且赋文件夹权限
if(!$filesystem->exists($avatar_upload_path) || !$filesystem->isWritable($avatar_upload_path)){
$filesystem->makeDirectory($avatar_upload_path, 0755, false, true);
}
//创建上传文件临时唯一名称
$temp_name = md5(\Carbon\Carbon::now()->timestamp.$avatar->getClientOriginalName()).'.'.$avatar->getClientOriginalExtension();
//move uploaded file to fixed public directory(将上传的文件移动到项目中的上传路径)
$path = $avatar->move($avatar_upload_path,$temp_name);
}
//插入操作
if(!empty($insertGetId = $userLogic->insertUser($request))){
//用户数据插入成功,判断上传文件以及上传路径是不是存在,符合条件,进行七牛云文件操作
if(!empty($temp_name) && !empty($avatar_upload_path) && $filesystem->exists($avatar_upload_path.$temp_name)){
//实例化工具类,创建上传到七牛云文件的名称:唯一
$utilService = new \App\Services\Util();
$avatar_name = $utilService->create_qiniu_unqiue_name(2,$insertGetId,$path);
if(!empty($avatar_name)){
//实例化七牛云操作类
$QiniuServices = new Qiniu(config('config.bucket_key')[2],true);
//七牛云上传文件
if(!empty($QiniuServices->upload($avatar_name, $path))){
$userLogic->where('id','=',$insertGetId)->update(['avatar'=>$avatar_name,'bucket_space'=>config('config.bucket_key')[2]]);
}
}
//delete uploaded file from local(删除本地项目上传文件)
$filesystem->delete($avatar_upload_path.$temp_name);
}
//记录操作日志
log_records('新增普通用户:'.$request->get('mobile'));
//show_message自定义的方法,就不写了
show_message('新增普通用户成功!', '/User/index', 1000,0);exit;
}else{
show_message('新增用户失败!','goback',1000,0);exit;
}
}
return view('backstage.user.add',$this->data);
}
.......
}
4,Logic文件夹中定义的部分代码如下:
<?php
namespace App\Logics;
use Illuminate\Support\Facades\DB;
/**
* Description of UserLogic
*
* @author timlu
*/
class UserLogic extends \Illuminate\Database\Eloquent\Model{
protected $table = "user";
//put your code here
public function getList($data = []){
if (!empty($data['sortby']) && !empty($data['sortvalue'])) {
$sortby = $this->table.'.'.$data['sortby'];
$sortvalue = trim($data['sortvalue']);
} else {
$sortby = $this->table.'.id';
$sortvalue = 'desc';
}
$list = DB::table($this->table)
->where(function($query) use($data) {
if (!empty($data['mobile'])) {
$query->where($this->table . '.mobile', 'like', '%' . $data['mobile'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['phone'])) {
$query->where($this->table . '.phone', 'like', '%' . $data['phone'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['realname'])) {
$query->where($this->table . '.realname', 'like', '%' . $data['realname'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['nickname'])) {
$query->where($this->table . '.nickname', 'like', '%' . $data['nickname'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['start_time']) && !empty($data['end_time'])) {
$query->where($this->table . '.lastlogin', '>=', $data['start_time'])
->where($this->table . '.lastlogin', '<=', $data['end_time']);
} else if (!empty($data['start_time'])) {
$query->where($this->table . '.lastlogin', '>=', $data['start_time']);
} else if (!empty($data['end_time'])) {
$query->where($this->table . '.lastlogin', '<=', $data['end_time']);
}
})
->select('id','realname','nickname','mobile','score','phone','lastlogin','is_active')
->orderBy($sortby, $sortvalue)
->take($data['pageSize'])
->skip($data['pageNo'] > 1 ? ($data['pageNo'] - 1) * $data['pageSize'] : 0)
->get();
$count = 0;
if (!empty($list)) {
$count = DB::table($this->table)
->where(function($query) use($data) {
if (!empty($data['mobile'])) {
$query->where($this->table . '.mobile', 'like', '%' . $data['mobile'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['phone'])) {
$query->where($this->table . '.phone', 'like', '%' . $data['phone'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['realname'])) {
$query->where($this->table . '.realname', 'like', '%' . $data['realname'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['nickname'])) {
$query->where($this->table . '.nickname', 'like', '%' . $data['nickname'] . '%');
}
})->where(function($query) use($data) {
if (!empty($data['start_time']) && !empty($data['end_time'])) {
$query->where($this->table . '.lastlogin', '>=', $data['start_time'])
->where($this->table . '.lastlogin', '<=', $data['end_time']);
} else if (!empty($data['start_time'])) {
$query->where($this->table . '.lastlogin', '>=', $data['start_time']);
} else if (!empty($data['end_time'])) {
$query->where($this->table . '.lastlogin', '<=', $data['end_time']);
}
})->count();
}
return [$list, $count];
}
public function getUserInfoById($id){
return self::find($id);
}
public function insertUser(\Illuminate\Http\Request $request){
if(!empty($request->get('realname',''))){
$data['realname']= strval($request->get('realname',''));
}
$data['nickname']= strval($request->get('nickname',''));
$data['mobile']=strval($request->get('mobile',''));
if(!empty($request->get('passwd',''))){
$data['passwd']=md5(strval($request->get('passwd','')));
}
$data['score'] = intval($request->get('score',0));
$data['sex'] = strval($request->get('sex',1));
$data['birthday']=strval($request->get('birthday',''));
$data['email']=strval($request->get('email',''));
if(!empty($request->get('qq',''))){
$data['qq']=strval($request->get('qq',''));
}
if(!empty($request->get('ip',''))){
$data['ip']=strval($request->get('ip',''));
}
$data['phone']=strval($request->get('phone',''));
$data['age']=intval($request->get('age',0));
$data['is_active']=strval($request->get('is_active',0));
return DB::table($this->table)->insertGetId($data);
}
public function updateUser(\Illuminate\Http\Request $request){
if(!empty($request->get('realname',''))){
$data['realname']= strval($request->get('realname',''));
}
$data['nickname']= strval($request->get('nickname',''));
$data['mobile']=strval($request->get('mobile',''));
if(!empty($request->get('passwd',''))){
$data['passwd']=md5(strval($request->get('passwd','')));
}
$data['score'] = intval($request->get('score',0));
$data['sex'] = strval($request->get('sex',1));
$data['birthday']=strval($request->get('birthday',''));
$data['email']=strval($request->get('email',''));
if(!empty($request->get('qq',''))){
$data['qq']=strval($request->get('qq',''));
}
if(!empty($request->get('ip',''))){
$data['ip']=strval($request->get('ip',''));
}
$data['phone']=strval($request->get('phone',''));
$data['age']=intval($request->get('age',0));
return DB::table($this->table)->where('id','=',intval($request->get('id')))->update($data);
}
}
是不是很简单,动手操作下吧
相关推荐
七牛云上传图片、拉取数据代码,下载七牛sdk修改配置即可使用,使用的ci框架
在Laravel中实现前端JavaScript上传图片到七牛云的过程,主要涉及以下几个步骤: 1. **引入依赖库**: 首先,你需要在HTML页面中引入必要的JavaScript库。这里使用了静态文件CDN来引入jQuery、Plupload以及七牛云...
2. **上传文件**:现在你可以使用 Laravel 的 `Storage` Facade 来上传文件到七牛云了。例如: ```php $filePath = 'path/to/your/file'; Storage::put('public/myfile.txt', File::get($filePath)); ``` 3. *...
在本文中,我们将深入探讨如何在Laravel框架中集成七牛云存储服务,这主要涉及到"Laravel开发-laravel-storage-qiniu"的主题。Laravel是一个流行的PHP框架,它提供了优雅的方式来构建web应用,而Qiniu是知名的云存储...
// 上传文件到七牛云 Storage::disk('qiniu')->put('file.jpg', file_get_contents($file_path)); ``` 这里的 `disk('qiniu')` 指定了使用七牛云的存储驱动。如果需要下载文件,可以使用 `get` 方法: ```php $url...
通过以上步骤和实践,我们可以将七牛云存储服务无缝集成到Laravel应用中,实现高效、可靠的文件存储和管理。在开发过程中,我们应遵循最佳实践,确保代码的可维护性和扩展性,同时充分利用七牛云提供的各种高级特性...
除了基本的文件操作,`qiniu-laravel-storage` 还支持七牛云特有的功能,如文件的上传策略、CDN 加速等。你可以通过调用七牛云 SDK 的方法来实现这些高级功能。 例如,如果你想自定义上传策略,可以使用 `...
5. **Artisan命令**:Laravel的命令行工具Artisan可能被利用来创建一些实用的命令,例如批量上传文件到七牛云,或者清理本地的临时文件。 6. **模型事件**:通过监听Laravel的Eloquent模型事件,如`saved`或`...
现在,我们已经完成了基础配置,可以开始使用Laravel的Filesystem API上传文件到七牛云了。例如,你可以这样上传一个文件: ```php use Illuminate\Support\Facades\Storage; // 获取文件 $file = \Request::file...
// 上传文件到七牛 $result = $disk->put($fileName, file_get_contents($file->getRealPath())); if ($result) { // 上传成功后的逻辑处理... } else { // 上传失败后的逻辑处理... } } return view('...
在实际应用中,需要注意图片上传的安全性,例如限制上传文件类型、大小等。同时,确保用户只能上传他们自己的文件,并对上传的文件进行鉴权处理,防止恶意用户通过编辑器接口获取其他用户的文件。 7. **测试与优化...
在Laravel框架中,"Storage"是一个强大的组件,用于处理文件系统操作,如读写文件、上传下载等。本教程将深入探讨如何在Laravel开发中利用Storage组件,并结合阿里云(Aliyun)、七牛云(Qiniu)和UCloud的云存储...
例如,上传文件可以这样实现: ```php use OC\Plugin\QiniuAdapter; $adapter = new QiniuAdapter(); $adapter->putFile('local_file_path', 'remote_file_name'); ``` QiniuAdapter还支持其他操作,如获取文件...
为了确保文件的安全性,你还可以设置七牛云的策略,例如设置访问权限、限制上传文件类型等。同时,Laravel 的事件监听器可以用来在文件上传前后执行特定操作,如发送通知、更新数据库等。 总之,Laravel 与七牛云的...
Laravel-ueditor是专门为Laravel框架设计的UEditor封装包,它允许开发者快速地在Laravel项目中集成UEditor,并提供了多种存储解决方案,包括本地存储、七牛云存储、又拍云存储和新浪云存储。这些存储方案使得用户...
在本项目“Laravel开发-qiniu-static .zip”中,我们主要关注的是如何在 Laravel 框架中集成七牛云存储服务来处理静态资源。Laravel 是一个优雅的 PHP Web 开发框架,它提供了丰富的工具和结构,使得开发者能够高效...
3. **七牛云存储**:七牛云是一家提供云存储和CDN服务的公司,其对象存储服务Qiniu Storage可提供安全、可靠的静态资源托管,并且支持大规模数据的上传、下载和处理。 4. **适配器模式**:在软件工程中,适配器模式...