laravel上传文件到七牛云存储
背景
最近在用PHP和laravel框架做一个图片网站,需要将图片存贮到云端,搜索下了对比了下功能,发现七牛云存储不错(主要小流量免费),便选择使用七牛作为图片存储空间。
要实现的功能很简单,选择本地图片上传到七牛,上传成功后添加图片及上传者信息到数据库。本文主要讲php通过七牛php-sdk显现简单的图片上传。
准备
1、已存在php5.4,laravel5,mysql5.5(没有使用到),composer,七牛账号(注册[传送门](https://portal.qiniu.com/signup))
2、安装php-sdk,采用composer安装,打开laravel根目录下的composer.json,添加"qiniu/php-sdk": "~7.0"到require关键字下,保存,运行composer update安装,即完成php-sdk的安装。
3、在config目录下添加qiniu.php配置文件,配置七牛相关的信息,配置如下
<?php
/**
* 七牛上传配置
*/
return [
'accessKey'=>'yourAccesskey',
'secretKey'=>'yourSecretkey',
'bucket'=>'fpstatic',//上传空间名称
'domain'=>'http://7xidgf.com1.z0.glb.clouddn.com'
];//空间域名
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
4、添加UploadController 控制器,并在router.php文件中添加一条路由,如下
`Route::controller('upload','UploadController');`
代码实现
先贴整个控制器代码
<?php namespace App\Http\Controllers;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use PhpParser\Node\Expr\Variable;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Input;
//导入七牛相关类
use Qiniu\Auth;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;
class UploadController extends Controller {
public function __construct(){
$this->middleware('activeUsers');
}
public function getIndex()
{
var_dump(isset($ret));
$data=$this->getPageData();//获取页面显示所需数据
$data['uploadSelected']=true;
return view('portal/upload')->with('data',$data);
}
/**
* 获取页面显示所需数据
* @return multitype:boolean \Illuminate\Support\Facades\mixed NULL
*/
private function getPageData(){
$data=[];//返回视图数据
$data['loginCount']=Redis::get('loginNum');//登陆人数
$data['activeUsersCount']=Input::get('activeUsers');//活跃人数
return $data;
}
public function postDoupload(){
$token=$this->getToken();
$uploadManager=new UploadManager();
$name=$_FILES['file']['name'];
$filePath=$_FILES['file']['tmp_name'];
$type=$_FILES['file']['type'];
list($ret,$err)=$uploadManager->putFile($token,$name,$filePath,null,$type,false);
if($err){//上传失败
var_dump($err);
return redirect()->back()->with('err',$err);//返回错误信息到上传页面
}else{//成功
//添加信息到数据库
return redirect()->back()->with('key',$ret['key']);//返回结果到上传页面
}
}
/**
* 生成上传凭证
* @return string
*/
private function getToken(){
$accessKey=config('qiniu.accessKey');
$secretKey=config('qiniu.secretKey');
$auth=new Auth($accessKey, $secretKey);
$bucket=config('qiniu.bucket');//上传空间名称
//设置put policy的其他参数
//$opts=['callbackUrl'=>'http://www.callback.com/','callbackBody'=>'name=$(fname)&hash=$(etag)','returnUrl'=>"http://www.baidu.com"];
return $auth->uploadToken($bucket);//生成token
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
视图代码
@extends('common/index')
@section('content')
<div class="row clearfix">
<div class="col-md-4 column">
</div>
<div class="col-md-4 column">
<form name="form" role="form" method="post" action="{{url('/upload/doupload')}}" enctype="multipart/form-data" onsubmit="return isValidateFile('file');">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="exampleInputFile">选择文件</label><input type="file" name='file' />
<p class="help-block">
</p>
</div>
<button type="submit" class="btn btn-default">上传</button>
</form>
</div>
<div class="col-md-4 column">
@if (session('key'))
<img alt="140x140" src="<?php echo config('qiniu.domain').'/'.session('key')?>?imageView2/2/w/400/h/400" class="img-rounded" />
@endif
</div>
</div>
<script>
function isValidateFile(obj) {
var extend = document.form.file.value.substring(document.form.file.value.lastIndexOf(".") + 1);
if (extend == "") {
alert("请选择图片!");
return false;
}
else {
if (!(extend == "jpg" || extend == "png" || extend =="gif")) {
alert("请上传后缀名为jpg、png或gif的文件!");
return false;
}
}
return true;
}
</script>
@endsection
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
详解:
1、流程:
上传页面选择图片,点击提交,提交到/upload/doupload,路由解析到uploadController下的postDoupload(不懂查看laravel手册路由章节,不用laravel就无所谓了,提交到对控制器器方法即可)
2上传流程

so我们首先要生成uptoken
3、导入七牛sdk相关的类
use Qiniu\Auth;
use Qiniu\Storage\BucketManager;
use Qiniu\Storage\UploadManager;
- 1
- 2
- 3
- 1
- 2
- 3
读取配置文件中的key,生成token方法
/**
* 生成上传凭证
* @return string
*/
private function getToken(){
$accessKey=config('qiniu.accessKey');
$secretKey=config('qiniu.secretKey');
$auth=new Auth($accessKey, $secretKey);
$bucket=config('qiniu.bucket');//上传空间名称
//设置put policy的其他参数
//$opts=['callbackUrl'=>'http://www.callback.com/','callbackBody'=>'name=$(fname)&hash=$(etag)','returnUrl'=>"http://www.baidu.com"];
return $auth->uploadToken($bucket);//生成token
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
然后就要上传文件了,文件post到了这个方法
public function postDoupload(){
$token=$this->getToken();
$uploadManager=new UploadManager();
$name=$_FILES['file']['name'];
$filePath=$_FILES['file']['tmp_name'];
$type=$_FILES['file']['type'];
list($ret,$err)=$uploadManager->putFile($token,$name,$filePath,null,$type,false);
if($err){//上传失败
var_dump($err);
return redirect()->back()->with('err',$err);//返回错误信息到上传页面
}else{//成功
//添加信息到数据库
return redirect()->back()->with('key',$ret['key']);//返回结果到上传页面
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
这里关键的一点是
$uploadManager->putFile($token,$name,$filePath,null,$type,false);
官方文档是这样的
list($ret, $err) = $uploadMgr->putFile($token, null, __file__);
坑爹的一点是,
__file__不讲清楚,那只好去查他的源码了,
查看后得到,putFile方法参数依次为token,存储的文件名,真是路径,参数,和文件类型,传入相应的参数即可成功完成上传
4,在文件上传页面,点击提交之前检测文件是否为图片格式,这里参考的是一位网友的js判断
<script>
function isValidateFile(obj) {
var extend = document.form.file.value.substring(document.form.file.value.lastIndexOf(".") + 1);
if (extend == "") {
alert("请选择图片!");
return false;
}
else {
if (!(extend == "jpg" || extend == "png" || extend =="gif")) {
alert("请上传后缀名为jpg、png或gif的文件!");
return false;
}
}
return true;
}
</script>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
要注意的是记得给html页面中form的name属性设置为“form”
5、上传成功后,将上传的图片显示在上传页面(当然也可以是其他页面,仅测试),直接使用上传成功后返回的key(即文件名)以及空间域名来生成完整的地址(当然不建议这样)
总结
这仅仅是一个简单的例子,实现上传到七牛云存储的方法还有很多种(比如直接利用表单上传),具体可搜索【php 七牛】关键字。同时利用七牛也能进行功能丰富的图片处理,可查看七牛文档。
[代码地址](https://github.com/kpmving/FP "optional title")
laravel上传文件到七牛云存储的更多相关文章
- 使用Qiniu-JavaScript-SDK上传文件至七牛云存储
一.Qiniu-JavaScript-SDK介绍 基于 JS-SDK 可以方便的从浏览器端上传文件至七牛云存储,并对上传成功后的图片进行丰富的数据处理操作. JS-SDK 兼容支持 H5 File A ...
- 记一次上传文件到七牛云存储的经历(Plupload & UEditor)(.net)
七牛 配置ACCESS_KEY和SECRET_KEY Qiniu.Conf.Config.ACCESS_KEY = "ACCESS_KEY"; Qiniu.Conf.Config. ...
- RN 上传文件到以及上传文件到七牛云(初步)
本文将介绍: 如何使用原生 Javascript 上传文件 如何使用七牛云 SDK 上传文件到七牛云 在 App 中文件上传是一个非常重要的需求,但是翻遍 React Naitve 的官方文档没有发现 ...
- SpringSpringBoot上传文件到七牛云
准备工作 maven pom.xml添加七牛云的sdk依赖 <dependency> <groupId>com.qiniu</groupId> <artifa ...
- 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法
一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...
- c++使用http协议上传文件到七牛云服务器
使用c++ http协议上传文件到七牛服务器时,比较搞的一点就是header的设置: "Content-Type:multipart/form-data;boundary=xxx" ...
- java(SSM)上传文件到七牛云(对象存储)
项目中会用到大量的图片和小视频,为了分担服务器压力,将文件都放在七牛云.这里的思路很简单, 就是移动端.pc端把文件上传到服务器,服务器做一个临时缓存,保存必要的信息到数据库后, 将文件上传到七牛云, ...
- 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...
- Laravel-admin 七牛云上传文件到七牛云出现卡顿失败情况
由于所做项目需要管理后台众多,所以选择了Laravel-admin后台框架进行开发.节省了权限控制以及页面处理等问题的时间 Laravel-admin文档地址 http://laravel-admin ...
随机推荐
- dynamic load javascript file.
$.ajax({ url : ("js/public/" + window.localStorage.getItem("lang") + ".js&q ...
- **优化--后端**: 计数缓存counter_cache; rack-mini-profiler(2300🌟) ; bullet(5000✨):侦测N+1query
rack-mini-profiler 这个 gem,可以永远显示网页的加载时间.(2300✨)开发环境和产品环境都可以用.(生成非常详细的报告) development环境,直接使用gem 'rack ...
- Oracle linux安装Oracle 11G
Oracle linux安装Oracle 11G 系统环境 Oracle linux 5.8.19.6(64位) Oracle 11.2.0.1(64位) 本文档详细介绍Oracle ...
- 个人知识管理系统Version1.0开发记录(09)
MyBatis初试 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索. 运用Mybatis框 ...
- redis集群登陆
如何登陆redis集群 redis-cli -h 10.12.4.45 -p 7000 -c -a alkdsjf134rj01 ip:10.12.4.45 集群中的一个点 -c 以集群方式登陆.cl ...
- python语言的优缺点
python作为一门高级编程语言,它的诞生虽然很偶然,但是它得到程序员的喜爱却是必然之路. 龟叔给Python的定位是“优雅”.“明确”.“简单”,所以Python程序看上去总是简单易懂,初学者学Py ...
- lvs+keepalived+bind实现负载均衡高可用智能dns【转】
转:https://www.cnblogs.com/mikeluwen/p/7068356.html 整体架构: 1.IP地址规划: Dns1:172.28.0.54 Dns2:172.28.0.55 ...
- 【git】提交到github不显示贡献小绿点问题的解决
问题描述: 最近一直在用github来写博客,但是今天发现github上的contributions记录并没有我的提交记录. 经过一番百度和自行捣鼓发现了问题所在. 原因: 最近实习,公司给配电脑.原 ...
- 对象存储在什么地方(java编程思想)
用引用操作对象.创建了一个引用,需要进行初始化(与事物进行关联),才能正常使用.new将引用于对象进行关联 对象存储到什么地方? 程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎么分配的呢?对这 ...
- Android 4.3发布 新增4大改变25日推送升级[附Android 4.3 工厂镜像]
北京时间7月25日,谷歌举行发布会,正式发布了全新的Nexus 7平板电脑以及Android 4.3系统. 其中Android 4.3系统隶属于4.X果冻豆(Jelly Bean)系列,是目前最新的操 ...