PHP与Javascript上传图片到七牛

qiniu.png

PHP后端上传

用composer安装SDK

composer require teg1c/thinkphp-qiniu-sdk

如果不行的话就在目录下的composer.json的require中添加

"teg1c/thinkphp-qiniu-sdk": "dev-master"

然后执行

composer update

在config文件夹里新建一个qiniu.php配置文件

<?php
return [
    'accesskey'=>'',//你的accesskey
    'secretkey'=>'',//你的secretkey
    'bucket'=>'',//你的上传空间名称
    'url'=>''//你的空间绑定的域名
];

修改vendor/teg1c/thinkphp-qiniu-sdk文件夹下Qiniu.php文件像这样

<?php

namespace tegic\qiniu;

use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use think\Exception;

require 'qiniu_php_driver/autoload.php';

class Qiniu
{
    private $_accessKey;
    private $_secretKey;
    private $_bucket;

    private $_error;

    /**
     * Qiniu constructor.
     * @param string $accessKey
     * @param string $secretKey
     * @param string $bucketName
     * 初始化参数
     */
    public function __construct($accessKey = "", $secretKey = "", $bucketName = "")
    {
        if (empty($accessKey) || empty($secretKey) || empty($bucketName)) {
            if (empty(config('qiniu.accesskey')) || empty(config('qiniu.secretkey')) || empty(config('qiniu.bucket'))) {
                $this->_error = '配置信息不完整';
                return false;
            }
            $this->_accessKey = config('qiniu.accesskey');
            $this->_secretKey = config('qiniu.secretkey');
            $this->_bucket    = config('qiniu.bucket');
        } else {
            $this->_accessKey = $accessKey;
            $this->_secretKey = $secretKey;
            $this->_bucket    = $bucketName;
        }
    }

    /**
     * @return bool|string
     * 获取bucket
     */
    private function _getBucket()
    {
        return $this->_bucket;
    }

    /**
     * @param string $saveName
     * @param string $bucket
     * @return mixed
     * @throws Exception
     * @throws \Exception
     * 单文件上传,如果添加多个文件则只上传第一个
     */
    public function upload($saveName = '', $bucket = '')
    {
        $token = $this->_getUploadToken($bucket);

        $files = $_FILES;
        if (empty($files)) {
            throw new Exception('没有文件被上传', 10002);
        }
        $values = array_values($files);

        $uploadManager = new UploadManager();
        if (empty($saveName)) {
            $saveName = hash_file('sha1', $values[0]['tmp_name']) . time();
        }
        $infoArr         = explode('.', $values[0]['name']);
        $extension       = array_pop($infoArr);
        $fileInfo        = $saveName . '.' . $extension;
        list($ret, $err) = $uploadManager->putFile($token, $saveName, $values[0]['tmp_name']);
        if ($err !== null) {
            throw new Exception('上传出错' . serialize($err));
        }
        return $ret['key'];
    }

    public function getUploadToken()
    {
        $auth   = new Auth($this->_accessKey, $this->_secretKey);
        $upToken = $auth->uploadToken($this->_getBucket());
        return $upToken;
    }

}

引入SDK TP5.1框架vendor会自动加载

use tegic\qiniu\Qiniu;

上传

public function UpFile($file){
      $qiniu = new Qiniu();
      $key = $qiniu-> upload('要保存的图片名称','空间名');
      return json([
        "code"=>200,
        "msg"=>"上传完成",
        "data"=>"您的七牛云域名/".$key
      ]);
    }

Base64上传

public function Base64($base64){
      $base64 = trim($base64);
      $base64 = str_replace('data:image/jpeg;base64,', '', $base64); //只要逗号后面的
      $qiniu = new Qiniu();
      $token = $qiniu->getUploadToken();

      $ret = $this->request_by_curl('https://up.qiniup.com/putb64/-1', $base64, $token);
      $key = json_decode($ret, true)['key'];
      return json([
        "code"=>200,
        "msg"=>"上传完成",
        "data"=>"您的七牛云域名/".$key
      ]);
    }

public function request_by_curl($remote_server, $post_string, $upToken){
      $headers = array();
      $headers[] = 'Content-Type:image/png';
      $headers[] = 'Authorization:UpToken ' . $upToken;
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $remote_server);
      //curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      //curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
      curl_setopt($ch, CURLOPT_TIMEOUT, 30);
      $data = curl_exec($ch);
      curl_close($ch);

      return $data;
    }

Javascript前端上传

首先引入七牛的js

<script href="https://unpkg.com/qiniu-js@2.5.3/dist/qiniu.min.js"></script>

选择图片使用ajax上传

//上传图片
$('#upimg').on("change",
function() {
    var file = this.files[0];
    //获取上传凭证
    $.ajax({
        type: "POST",
        url: "getToken",//获取上传凭证的接口
        dataType: "json",
        data: {
            name: file.name
        },
        success: function(result) {
            var key = result.key;
            var token = result.token;
            var config = {
                region: qiniu.region.z1
            };
            var putExtra = {
                mimeType: ["image/jpg", "image/png", "image/jpeg"]
            };
            var observable = qiniu.upload(file, key, token, putExtra, config);
            observable.subscribe({
                next: (res) = >{
                    // 主要用来展示进度
                    let total = res.total;
                    console.log("进度:" + parseInt(total.percent) + "%");
                },
                error: (err) = >{
                    // 失败报错信息
                    console.log(err)
                },
                complete: (res) = >{
                    // 接收成功后返回的信息
                    console.log(res)
                }
            });
        }
    });
});

上传Base64图片

  //dataURL 是base64数据
  var pic = dataURL.replace('data:image/jpeg;base64,' ,'') //base64后的字符串
  var url = "https://upload-z1.qiniup.com/putb64/-1"; //非华东空间需要根据注意事项
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange=()=>{
    if (xhr.readyState==4){
      var dataInfo = JSON.parse(xhr.response) //将返回的字符串转化为JSON对象
      console.log(dataInfo);
    }
  }
  xhr.open("POST", url, true);
  xhr.setRequestHeader("Content-Type", "application/octet-stream");
  xhr.setRequestHeader("Authorization", 'UpToken {$token}');//替换上传token
  xhr.send(pic);

后端的凭证接口

    //返回图片上传所需要的参数
    public function getToken()
    {
        if(Request::isAjax()){
            $qiniu = new Qiniu();
            return [
                'key' => createImgName() . '-' . input('post.name'),
                'token' => $qiniu->getUploadToken()
            ];
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,104评论 1 45
  • 我不管,我就是要先来一个好看的小姐姐。 引言 之前用VUE + VUX做了一个VUE单页应用,在beta版本因为开...
    iimT阅读 5,376评论 3 6
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 8,620评论 0 3
  • 十年生死两茫茫,不思量,自难忘。 她像是一个神秘的存在,像所有的梦中情人一样,难忘的初恋,最难忘的可能不是人...
    冬季有暖阳阅读 248评论 0 3
  • 1.各种好的小习惯能养成优秀的人。 2.不要一味地付出,你要知道对方到底需不需要,如果不需要,你越付出对他伤害越大...
    Eric小风阅读 195评论 0 0