图片上传


上一篇 : 创建发布任务 下一篇: 刷手接取任务




图片上传有两种方式 

1 APP端传入base64格式的图片字符串

2 直接传入文件流

创建数据库

CREATE TABLE `up61_asset` (

  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',

  `file_size` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '文件大小,单位B',

  `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上传时间',

  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态;1:可用,0:不可用',

  `download_times` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '下载次数',

  `file_key` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '文件惟一码',

  `filename` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '文件名',

  `file_path` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '文件路径,相对于upload目录,可以为url',

  `file_md5` varchar(32) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '文件md5值',

  `file_sha1` varchar(40) CHARACTER SET utf8 NOT NULL DEFAULT '',

  `suffix` varchar(10) NOT NULL DEFAULT '' COMMENT '文件后缀名,不包括点',

  `more` text COMMENT '其它详细信息,JSON格式',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=351 DEFAULT CHARSET=utf8mb4 COMMENT='资源表';


<?php
/**
* Created by PhpStorm.
* User: [一秋]
* Date: 2018/3/29
* Time: 11:23
* Desc: 成功源于点滴
*/

namespace app\index\controller;

use think\Db;
use think\File;
use think\Validate;
use think\Image;
class Asset extends UserBaseController
{
   public function base64img(){

       $validate = new Validate([
           'base64img'=>'require'
       ]);
       $validate->message([
           'base64img.require'=>'请选择要上传的图片!'
       ]);

       $data = $this->request->param();
       if (!$validate->check($data)) {
           $this->error($validate->getError());
       }

       $user_id = $this->getUserId();
       $base64imag = $this->request->post('base64img');
       //转化base64img为图片 并返回路径

       $base64 = explode('###',$base64imag);
       $map = [];
       foreach ($base64 as $key=>$value){
           $imgPath = saveBase64Img($value);

           //图片存储到数据库中 返回图片id
           $image = Image::open('../upload/'.$imgPath);

           $file = new File('../upload/'.$imgPath);

           $data = [
               'user_id'=>$user_id,
               'file_size'=>$file->getSize(),
               'create_time'=>time(),
               'status'=>1,
               'file_path'=>$imgPath,
               'suffix'=>$image->type(),
               'filename'=>$file->getFilename()
           ];
           Db::name('asset')->insertGetId($data);

           $map[$key] = [
               'img_url'=>$imgPath,
               'full_img_url'=>img_host($imgPath),
           ];
       }

       $this->success('上传成功',$map);

   }


   /**
    * 获取文件路径
    */
   public function getFilePath(){

       $user_id = $this->getUserId();

       $map = [];
       $file = request()->file('file_path');
       // 移动到框架应用根目录/public/uploads/ 目录下
       if($file){
           $info = $file->move( ROOT_PATH . 'public' . DS . 'upload' . DS . 'img' );
           if($info){
               $imgPath = str_replace('\\','/','img/'.$info->getSaveName());

               $data = [
                   'user_id'=>$user_id,
                   'file_size'=>$info->getSize(),
                   'create_time'=>time(),
                   'status'=>1,
                   'file_path'=>$imgPath,
                   'suffix'=>$info->getExtension(),
                   'filename'=>$info->getFilename()
               ];
               Db::name('asset')->insertGetId($data);

               $map['img_url'] = $imgPath;
               $map['full_img_url'] = img_host($imgPath);
               $this->success('上传成功',$map);
           }else{
               // 上传失败获取错误信息
               $this->error($file->getError());
           }
       }else{
           $this->error('未接收到文件');
       }

   }
}


新建公共函数

//图片资源的域名
function img_host($img_url){
   if(preg_match('/\x20*https?\:\/\/.*/i',$img_url)){
       return $img_url;
   }
//    return 'http://'.request()->host().'/upload/'.$img_url;
   return 'http://up61_whale.cn/upload/'.$img_url;
}
function saveBase64Img($logo,$path = 'img')
{
   $ret = '';
   preg_match('/^(data:\s*image\/(\w+);base64,)/', $logo, $result);
//    $type = $result [2];
   $type = 'png';

   $path_full = '../upload/'.$path.'/'. date('Ymd');
   $path = $path.'/'. date('Ymd');
   if (!is_dir($path_full)) {
       mkdir(iconv("UTF-8", "GBK", $path_full), 0777, true);
   }

   $imgname = md5(time().rand(1000,9999));

   $new_file = $path_full . '/' . $imgname . "." . $type;

   $a = file_put_contents($new_file, base64_decode(str_replace($result [1], '', $logo)));

   if ($a) {
       return $path. '/' . $imgname . "." . $type;
   }
   return $ret;
}

新增路由

//图片上传
Route::post('file/upload','index/Asset/getFilePath');
Route::post('file/base64/upload','index/Asset/base64img');


上一篇 : 创建发布任务 下一篇: 刷手接取任务