thinkphp5 上传图片
上传文件
ThinkPHP5.0对文件上传的支持更加简单。
假设表单代码如下:
然后在控制器中添加如下的代码:
public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file(‘image’);
// 移动到框架应用根目录/public/uploads/ 目录下
if($file){
$info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
if($info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
}
move方法成功的话返回的是一个\think\File对象,你可以对上传后的文件进行后续操作。
多文件上传
如果你使用的是多文件上传表单,例如:
控制器代码可以改成:
public function addArticle()
{
//判断提交的方式
if(\request()->isPost()){
//多图上传
$arryFile =\request()->file(“path”);
a
r
r
I
m
g
=
[
]
;
f
o
r
e
a
c
h
(
arrImg=[]; foreach (
arrImg=[];foreach(arryFile as $File){
$pathImg=“”;
//移动文件到框架应用更目录的public/uploads/
$info =
F
i
l
e
−
>
m
o
v
e
(
R
O
O
T
P
A
T
H
.
′
p
u
b
l
i
c
′
.
D
S
.
′
u
p
l
o
a
d
′
.
D
S
.
′
a
r
t
i
c
l
e
′
.
D
S
.
d
a
t
e
(
′
Y
′
)
.
D
S
.
d
a
t
e
(
′
m
−
d
′
)
,
m
d
5
(
m
i
c
r
o
t
i
m
e
(
t
r
u
e
)
)
)
;
i
f
(
File->move(ROOT_PATH . 'public' . DS . 'upload' . DS . 'article' . DS . date('Y') . DS . date('m-d'),md5(microtime(true))); if (
File−>move(ROOTPATH.′public′.DS.′upload′.DS.′article′.DS.date(′Y′).DS.date(′m−d′),md5(microtime(true)));if(info) {
$pathImg = “/public/upload/article/” . date(‘Y’) . ‘/’ . date(‘m-d’) . ‘/’ . $info->getFilename();
} else {
//错误提示用户
return
t
h
i
s
−
>
e
r
r
o
r
(
this->error(
this−>error(File->getError());
}
// $result[“img_url”]
$arrImg[]= $pathImg;
}
i
n
s
e
r
t
d
a
t
a
[
"
i
m
g
u
r
l
"
]
=
i
m
p
l
o
d
e
(
"
,
"
,
insert_data["img_url"]=implode(",",
insertdata["imgurl"]=implode(",",arrImg);
Db::name(“articles”)->insert($insert_data);
}
return $this->fetch(“article-add”);
}
上传验证
支持对上传文件的验证,包括文件大小、文件类型和后缀:
public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file(‘image’);
// 移动到框架应用根目录/public/uploads/ 目录下
$info =
f
i
l
e
−
>
v
a
l
i
d
a
t
e
(
[
′
s
i
z
e
′
=
>
15678
,
′
e
x
t
′
=
>
′
j
p
g
,
p
n
g
,
g
i
f
′
]
)
−
>
m
o
v
e
(
R
O
O
T
P
A
T
H
.
′
p
u
b
l
i
c
′
.
D
S
.
′
u
p
l
o
a
d
s
′
)
;
i
f
(
file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move(ROOT_PATH . 'public' . DS . 'uploads'); if(
file−>validate([′size′=>15678,′ext′=>′jpg,png,gif′])−>move(ROOTPATH.′public′.DS.′uploads′);if(info){
// 成功上传后 获取上传信息
// 输出 jpg
echo $info->getExtension();
// 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
echo $info->getSaveName();
// 输出 42a79759f284b767dfcb2a0197904287.jpg
echo $info->getFilename();
}else{
// 上传失败获取错误信息
echo $file->getError();
}
}
**
上传到七牛云
**
1-安装七牛云官方SDK
composer require qiniu/php-sdk -vvv
2-七牛云配置
1----config文件
//七牛云配置
‘qiniu’ => [
‘accessKey’ => ‘…’,
‘secretKey’ => ‘…’,
‘domain’ => ‘…’,//域名地址
‘bucket’ => ‘…’,//空间名称
‘zone’=> ‘south_china’//区域
],
3- 对应的控制器
use Qiniu\Auth;
require ‘vendor/qiniu/php-sdk/autoload.php’; //引入自动加载类
use Qiniu\Storage\UploadManager; //实例化上传类
public function add(){
$file = request()->file(‘img’);
// 要上传图片的本地路径
$filePath = $file->getRealPath();
e
x
t
=
p
a
t
h
i
n
f
o
(
ext = pathinfo(
ext=pathinfo(file->getInfo(‘name’), PATHINFO_EXTENSION); //后缀
// 上传到七牛后保存的文件名
k
e
y
=
s
u
b
s
t
r
(
m
d
5
(
key =substr(md5(
key=substr(md5(file->getRealPath()) , 0, 5). date(‘YmdHis’) . rand(0, 9999) . ‘.’ . $ext;
// 需要填写你的 Access Key 和 Secret Key
// 构建鉴权对象
$accessKey =config(“qiniu”)[“accessKey”];
$secretKey =config(“qiniu”)[“secretKey”];
a
u
t
h
=
n
e
w
A
u
t
h
(
auth=new Auth(
auth=newAuth(accessKey,$secretKey);
// 要上传的空间
$bucket =config(“qiniu”)[“bucket”];
//域名
$domain=config(“qiniu”)[“domain”];
$token =
a
u
t
h
−
>
u
p
l
o
a
d
T
o
k
e
n
(
auth->uploadToken(
auth−>uploadToken(bucket);
// 初始化 UploadManager 对象并进行文件的上传
u
p
l
o
a
d
M
g
r
=
n
e
w
U
p
l
o
a
d
M
a
n
a
g
e
r
(
)
;
/
/
调用
U
p
l
o
a
d
M
a
n
a
g
e
r
的
p
u
t
F
i
l
e
方法进行文件的上传
l
i
s
t
(
uploadMgr = new UploadManager(); // 调用 UploadManager 的 putFile 方法进行文件的上传 list(
uploadMgr=newUploadManager();//调用UploadManager的putFile方法进行文件的上传list(ret, $err) =
u
p
l
o
a
d
M
g
r
−
>
p
u
t
F
i
l
e
(
uploadMgr->putFile(
uploadMgr−>putFile(token, $key,
f
i
l
e
P
a
t
h
)
;
i
f
(
filePath); if (
filePath);if(err !== null) {
return [“err”=>1,“msg”=>$err,“data”=>“”];
} else {
//返回图片的完整URL
i
m
g
P
a
t
h
=
imgPath=
imgPath=domain.‘/’.$key;
//赋值
$data[“thumb_url”] = $imgPath;
d
a
t
a
=
D
b
:
:
n
a
m
e
(
′
t
o
p
b
a
r
′
)
−
>
i
n
s
e
r
t
(
data = Db::name('top_bar')->insert(
data=Db::name(′topbar′)−>insert(data);
$this->redirect(“/admin/topbar/index”);
}
}
**
上传到阿里云OSS
**
1.下载一个阿里云oss的sdk 也可以到阿里云 的OSS存储里面去下载
composer require aliyuncs/oss-sdk-php
2-在application同级目录的config.php的文件,配置信息放进去向下面这样
<?php
'appliy_oss'=>[
'KeyId' => '', //Access Key ID
'KeySecret' => '', //Access Key Secret
'Endpoint' => '', //阿里云oss 外网地址endpoint
'Bucket' => '', //Bucket名称
]
3-控制器
方法(一)
/*
* 图片上传到阿里云OSS
*/
public function upload_img_oss(){
$type=input(“param.type”,“files”);
$img = request()->file(‘file’);
r
e
s
R
e
s
u
l
t
=
I
m
a
g
e
:
:
o
p
e
n
(
resResult = Image::open(
resResult=Image::open(img);
// 尝试执行
try {
$config = Config(‘appliy_oss’); //获取Oss的配置
//实例化对象 将配置传入
o
s
s
C
l
i
e
n
t
=
n
e
w
O
s
s
C
l
i
e
n
t
(
ossClient = new OssClient(
ossClient=newOssClient(config[‘KeyId’], $config[‘KeySecret’], $config[‘Endpoint’]);
//这里是有sha1加密 生成文件名 之后连接上后缀
$fileName = $type.'/' . sha1(date('YmdHis', time()) . uniqid()) . '.' . $resResult->type();
//执行阿里云上传
$result = $ossClient->uploadFile($config['Bucket'], $fileName, $img->getInfo()['tmp_name']);
/**
* 这个只是为了展示
* 可以删除或者保留下做后面的操作
*/
/*$arr = [
//图片地址
'imgurl' => $result['info']['url'],
//数据库保存名称
'dbimgName' => $fileName
];*/
return json(["code"=> 1, "msg" => "上传成功", "url" => $result['info']['url']]);
} catch (OssException $e) {
// 上传失败获取错误信息0
return json(["code"=> 0, "msg" => $e->getMessage(), "url" => '']);
// return
}
///将结果输出
return $arr;/
}
方法(二)
/*
* 图片上传到阿里云OSS
*/
public function upload_oss(){
$type=input("param.type","files");
$file = $_FILES;
$img = current($file);
// 尝试执行
try {
$config = Config('appliy_oss'); //获取Oss的配置
//实例化对象 将配置传入
$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
//获取文件后缀
$file_type=substr($img["type"],strripos($img["type"],"/")+1);
//这里是有sha1加密 生成文件名 之后连接上后缀
$fileName = $type.'/' . sha1(date('YmdHis', time()) . uniqid()). '.' .$file_type;
//执行阿里云上传
$result = $ossClient->uploadFile($config['Bucket'], $fileName, $img['tmp_name']);
/**
* 这个只是为了展示
* 可以删除或者保留下做后面的操作
*/
/*$arr = [
//图片地址
'imgurl' => $result['info']['url'],
//数据库保存名称
'dbimgName' => $fileName
];*/
return json(["code"=> 1, "msg" => "上传成功", "url" => $result['info']['url']]);
} catch (OssException $e) {
// 上传失败获取错误信息0
return json(["code"=> 0, "msg" => $e->getMessage(), "url" => '']);
}
}
上传到阿里云OSS2
config 配置文件
‘local_upload_path’=>ROOT_PATH . ‘public’ . DS . ‘uploads’,
‘oss’=>[
‘accessKeyId’ => “XXXXXXXXXXXXXXXX”,
‘accessKeySecret’ => “XXXXXXXXXXXXXXXX”,
// Endpoint以杭州为例,其它Region请按实际情况填写。
‘endpoint’ => “XXXXXXXXXXXXXXXX”,
// 存储空间名称
‘bucket’=> “XXXXXXXXXXXXXXXX”,
// 文件名称
‘object’ => “XXXXXXXXXXXXXXXX”
],
/**
-
上传图片到本地
*/public function upload(){
// 获取表单上传文件 例如上传了001.jpg
$file = request()->file(‘myfile’);// 移动到框架应用根目录/public/uploads/ 目录下 if($file){ $info = $file->move(config('local_upload_path')); if($info){ // 成功上传后 获取上传信息 $target = config('local_upload_path').DS.$info->getSaveName(); //上传到oss $res = $this->oss_upload($target, $info->getFilename()); exit(json_encode($res)); }else{ // 上传失败获取错误信息 //echo $file->getError(); exit(json_encode(array('code'=>2,'mes'=>$file->getError()))); } }
}
/** -
上传图片到阿里云oss
-
@param $target 文件路径
-
@param $filename 上传oss时文件名
-
@return mixed
*/
public function oss_upload( t a r g e t , target, target,filename){
import(‘aliyun.autoload’);
$accessKeyId = config(‘oss.accessKeyId’);
$accessKeySecret = config(‘oss.accessKeySecret’);
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = config(‘oss.endpoint’);
// 存储空间名称
$bucket= config(‘oss.bucket’);
// 文件名称
$object = config(‘oss.object’);$ossClient = new \OSS\OssClient($accessKeyId, $accessKeySecret, $endpoint); try { $res = $ossClient->doesBucketExist($bucket); } catch (\OSS\Core\OssException $e) { $result['mes'] = $e->getMessage(); $result['code'] = 3; return $result; } if ($res === true) { try { $object = $object.'/'.$filename; $info = $ossClient->uploadFile($bucket, $object, $target); $result['message'] = '上传成功'; $result['code'] = 0; $result['pic'] = $info['info']['url']; return $result; } catch (\OSS\Core\OssException $e) { $result['mes'] = $e->getMessage(); $result['code'] = 4; return $result; } } else { $result['message'] = '服务端存储空间不存在'; $result['code'] = 1; return $result; }
}
AjAx提交图片
1–单图上传
html 代码 如下
{include file=“common/blank” /}
<![endif]–>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>会员名:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" class="input-text" value="" placeholder="" id="user_name" name="user_name">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>头像:</label>
<div class="formControls col-xs-8 col-sm-9">
<input class="file" type="file" name="file" id="file">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>手机:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" class="input-text" value="" placeholder="" id="phone" name="phone">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>邮箱:</label>
<div class="formControls col-xs-8 col-sm-9">
<input type="text" class="input-text" placeholder="@" name="email" id="email">
</div>
</div>
<div class="row cl">
<label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>状态:</label>
<div class="formControls col-xs-8 col-sm-9 skin-minimal">
<div class="radio-box">
<input type="radio" id="status-1" name="status" value="1" checked>
<label for="status-1">已启用</label>
</div>
<div class="radio-box">
<input type="radio" id="status-0" name="status" value="0">
<label for="status-0">已禁用</label>
</div>
</div>
</div>
<div class="row cl">
<div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3">
<input class="btn btn-primary radius" onclick="check()" type="submit" value=" 提交 ">
</div>
</div>
</form>
{include file=“common/footer” /}
控制器代码如下 public function addUser(){ if(\request()->isPost()){ $insert_array=array(); $insert_array["user_name"]=input("user_name"); $insert_array["password"]=password_hash(input("password"),1); $insert_array["email"]=input("email"); $insert_array["phone"]=input("phone"); $insert_array["status"]=input("status"); $insert_array["last_time"]=time(); $insert_array["last_ip"]=\request()->ip(); $insert_array["add_time"]=time(); $insert_array["update_time"]=time(); $file=\request()->file("file"); if ($file){ $imgPath=""; //移动文件位置 if ($file){ $info = $file->move(ROOT_PATH . 'public' . DS . 'upload' . DS . 'user' . DS . date('Y') . DS . date('m-d'),md5(microtime(true))); if ($info) { // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg $imgPath = "/upload/user/" . date('Y') . '/' . date('m-d') . '/' . $info->getSaveName(); } }else{ return $this->error($file->getError()); } //赋值 $insert_array["user_logo"]=$imgPath; $result=Db::name("user")->insert($insert_array); if ($result){ exit(json_encode(array("status"=>1,"msg"=>"添加成功"))); }else{ exit(json_encode(array("status"=>0,"msg"=>"添加失败"))); } }else{ echo ""; } } return $this->fetch("user-add"); }将base64编码的图片上传
在一些的开发中,可能会遇到将图片以base64编码的形式进行上传,
代码如下:
前端代码:
html:
js:
//添加
function add_sumbit() {
var user_logo=$("#test1").attr("data-src");
$.post(
"{:url('admin/user/add')}",
{user_logo:user_logo},
function (data) {
console.log(data);
if(data.code==1){
layer.msg(data.msg,{icon:1});
setTimeout(function () {
parent.layer.closeAll();
parent.location.reload();
},1500);
}else{
layer.msg(data.msg,{icon:2});
}
});
}
//(base64编码)
function basess(t) {
var file = t.files[0];
// 读取文件:
var reader = new FileReader();
reader.onload = function(e) {
console.log(e);
var data = e.target.result; // 'data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...'
$(t).parent().find('img').attr('src', data);
$(t).attr('data-src', data);
};
// 以DataURL的形式读取文件:
reader.readAsDataURL(file);
}
控制器代码:
u
s
e
r
l
o
g
o
=
i
n
p
u
t
(
"
p
a
r
a
m
.
u
s
e
r
l
o
g
o
"
)
;
i
f
(
i
s
i
m
a
g
e
b
a
s
e
64
(
user_logo=input("param.user_logo"); if (is_image_base64(
userlogo=input("param.userlogo");if(isimagebase64(user_logo)) {
$upload=new UploadController();
l
i
s
t
[
"
u
s
e
r
l
o
g
o
"
]
=
list["user_logo"]=
list["userlogo"]=upload->upload_base64(“user”,$user_logo); //调用图片上传的方法
} else {
$list[“user_logo”] = $user_logo;
}
方法说明:
/*
- 检查图片是不是bases64编码的
/
function is_image_base64(KaTeX parse error: Expected '}', got 'EOF' at end of input: …ase64) { /*if(base64==base64_encode(base64_decode($base64))){
return true;
}else{
return false;
}/
if (preg_match(‘/^(data:\s*image/(\w+);base64,)/’, $base64, $result)){
return true;
}else{
return false;
}
}
upload控制器的方法;
//图片上传为base64为的图片
public function upload_base64($type,$img){
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $result)){
$type_img = $result[2]; //得到图片的后缀
//上传 的文件目录
$new_files = ROOT_PATH . 'public' . DS . 'upload'. DS . $type. DS . date('Y') . DS . date('m-d') . DS ;
if(!file_exists($new_files)) {
//检查是否有该文件夹,如果没有就创建,并给予最高权限
//服务器给文件夹权限
mkdir($new_files, 0777,true);
}
$new_files = $new_files.date("YmdHis").".{$type_img}";
if (file_put_contents($new_files, base64_decode(str_replace($result[1], '', $img)))){
//上传成功后 得到信息
$filenames=str_replace('\\', '/', $new_files);
$file_name=substr($filenames,strripos($filenames,"/upload"));
return $file_name;
}else{
return false;
}
}else{
return false;
}
}