上传到七牛云存储的原理就是先把图片文件上传到本地,然后再从本地拿到文件上传到七牛,那么方法应该怎么做呢?

1.先去七牛云官网下载七牛云的PDK(工具),然后放到vendor文件夹下面

2.去app/Functions建立Qiniu.php(Functions文件夹需自己建)

3.Qiniu.php

<?php 
require_once __DIR__.'/../../vendor/qiniu/php-sdk/autoload.php';
 //qiniu上传的sdk文件夹放在vendor文件夹下
 use Qiniu\Auth;
 use Qiniu\Storage\UploadManager;
 use Qiniu\Storage\BucketManager;

 // AK和SK,和上传空间要在该页面设置,AK和SK和bucket名字要上七牛才能看见
 
  global $accessKey;
 global $secretKey;
 global $bucket;
 global $prePath;
 $accessKey='填写你的AK';
 $secretKey='填写你的SK';
 $bucket='填写你的空间名';
 $prePath='lib/uploads/images/';//上传目录名

// 上传至七牛
  function uptoQiniu($pic = null){
      //参数:文件名


        global $accessKey; 
        global $secretKey;
        // 构建鉴权对象
        $auth = new Auth($accessKey, $secretKey);

            global $bucket;
            // 生成上传 Token
            $token = $auth->uploadToken($bucket);
            // echo $token;exit();
            // 要上传文件的本地路径$filePath
            global $prePath;
            $filePath=$prePath.$pic;
            // 上传到七牛后保存的文件名$key
            $key=$pic;

            // 初始化 UploadManager 对象并进行文件的上传
            $uploadMgr = new UploadManager();

            // 调用 UploadManager 的 putFile 方法进行文件的上传
            list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
            // echo "\n====> putFile result: \n";
            // if ($err !== null) {
            //     var_dump($err);
            // } else {
            //     var_dump($ret);
            // }

    }

// 从七牛删除
    function deleteFromQiniu($key = null){
      // 参数$key为要删除的文件名
         global $accessKey; 
         global $secretKey;

          //初始化Auth状态
          $auth = new Auth($accessKey, $secretKey);

          //初始化BucketManager
          $bucketMgr = new BucketManager($auth);

          //你要测试的空间, 并且这个key在你空间中存在
          global $bucket;
         

          //删除$bucket 中的文件 $key
          $err = $bucketMgr->delete($bucket, $key);
          echo "\n====> delete $key : \n";
          if ($err !== null) {
              var_dump($err);
          } else {
              echo "Success!";
          }


    }
//双参数版
 function uptoQiniuDouble($picFrom,$pic){
      //参数1:文件地址,参数2:文件名




        global $accessKey; 
        global $secretKey;
        // 构建鉴权对象
        $auth = new Auth($accessKey, $secretKey);


            global $bucket;
            // 生成上传 Token
            $token = $auth->uploadToken($bucket);
            // echo $token;exit();
            // 要上传文件的本地路径$filePath
            
            $filePath=$picFrom;
            // 上传到七牛后保存的文件名$key
            $key=$pic;


            // 初始化 UploadManager 对象并进行文件的上传
            $uploadMgr = new UploadManager();


            // 调用 UploadManager 的 putFile 方法进行文件的上传
            list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
            // echo "\n====> putFile result: \n";
            // if ($err !== null) {
            //     var_dump($err);
            // } else {
            //     var_dump($ret);
            // }


    }


 ?>


4.然后去public/index.php中,加入这两句,定义七牛给你的外链,

// 公共上传到七牛云的方法
require __DIR__.'/../app/Functions/qiniu.php';
define("Qiniu", "七牛给你的外链网址,需要加http://");


4.1也可以去composer.json中定义

"autoload": {
        "classmap": [
            "database"
        ],
         
        "psr-4": {
            "App\\": "app/"
        },
        "files":[
            "app/Functions/qiniu.php"
        ]


5.然后在需要上传的地方使用uptoQiniu(文件名)就可以啦!

6.如果是xheditor编辑器中想把图片上传到七牛,更改public/upload.php

<?php
/*!
 * upload demo for php
 * @requires xhEditor
 * 
 * @author Yanis.Wang<yanis.wang@gmail.com>
 * @site http://xheditor.com/
 * @licence LGPL(http://www.opensource.org/licenses/lgpl-license.php)
 * 
 * @Version: 0.9.6 (build 111027)
 * 
 * 注1:本程序仅为演示用,请您务必根据自己需求进行相应修改,或者重开发
 * 注2:本程序特别针对HTML5上传,加入了特殊处理
 */
require_once "../app/Functions/qiniu.php";
//引入七牛文件,否则报错状态码500,必须是require_once,不能用include

header('Content-Type: text/html; charset=UTF-8');
$inputName='filedata';//表单文件域name
$attachDir='lib/uploads';//上传文件保存路径,结尾不要带/
$editorShow='外链网址'; //你的服务器网址,本体就用'http://localhost:8000/'

$dirType=1;//1:按天存入目录 2:按月存入目录 3:按扩展名存目录  建议使用按天存
$maxAttachSize=2097152;//最大上传大小,默认是2M
$upExt='jpg,jpeg,gif,png';//上传扩展名
$msgType=1;//返回上传参数的格式:1,只返回url,2,返回参数数组
$immediate=isset($_GET['immediate'])?$_GET['immediate']:0;//立即上传模式,仅为演示用
ini_set('date.timezone','Asia/Shanghai');//时区

$err = "";
$msg = "''";
$tempPath=$attachDir.'/'.date("YmdHis").mt_rand(10000,99999).'.tmp';
$localName='';

if(isset($_SERVER['HTTP_CONTENT_DISPOSITION'])&&preg_match('/attachment;\s+name="(.+?)";\s+filename="(.+?)"/i',$_SERVER['HTTP_CONTENT_DISPOSITION'],$info)){//HTML5上传
	file_put_contents($tempPath,file_get_contents("php://input"));
	$localName=urldecode($info[2]);
}
else{//标准表单式上传
	$upfile=@$_FILES[$inputName];
	if(!isset($upfile))$err='文件域的name错误';
	elseif(!empty($upfile['error'])){
		switch($upfile['error'])
		{
			case '1':
				$err = '文件大小超过了php.ini定义的upload_max_filesize值';
				break;
			case '2':
				$err = '文件大小超过了HTML定义的MAX_FILE_SIZE值';
				break;
			case '3':
				$err = '文件上传不完全';
				break;
			case '4':
				$err = '无文件上传';
				break;
			case '6':
				$err = '缺少临时文件夹';
				break;
			case '7':
				$err = '写文件失败';
				break;
			case '8':
				$err = '上传被其它扩展中断';
				break;
			case '999':
			default:
				$err = '无有效错误代码';
		}
	}
	elseif(empty($upfile['tmp_name']) || $upfile['tmp_name'] == 'none')$err = '无文件上传';
	else{
		move_uploaded_file($upfile['tmp_name'],$tempPath);
		$localName=$upfile['name'];
	}
}

if($err==''){
	$fileInfo=pathinfo($localName);
	$extension=$fileInfo['extension'];
	if(preg_match('/^('.str_replace(',','|',$upExt).')$/i',$extension))
	{
		$bytes=filesize($tempPath);
		if($bytes > $maxAttachSize)$err='请不要上传大小超过'.formatBytes($maxAttachSize).'的文件';
		else
		{
			switch($dirType)
			{
				case 1: $attachSubDir = 'day_'.date('ymd'); break;
				case 2: $attachSubDir = 'month_'.date('ym'); break;
				case 3: $attachSubDir = 'ext_'.$extension; break;
			}
			$attachDir = $attachDir.'/'.$attachSubDir;
			if(!is_dir($attachDir))
			{
				@mkdir($attachDir, 0777);
				@fclose(fopen($attachDir.'/index.htm', 'w'));
			}
			PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
			$newFilename=date("YmdHis").mt_rand(1000,9999).'.'.$extension;
			// 图片的路径
			$targetPath = $attachDir.'/'.$newFilename;
	
			rename($tempPath,$targetPath);
			@chmod($targetPath,0755);
			$targetPath=jsonString($targetPath);
			if($immediate=='1')$targetPath='!'.$targetPath;
			// $editorShow=$editorShow.$targetPath;原版
			$editorShow=$editorShow.$newFilename;//七牛版
			uptoQiniuDouble($targetPath,$newFilename);//上传七牛

			if($msgType==1)$msg="'$editorShow'";
			else $msg="{'url':'".$editorShow."','localname':'".jsonString($localName)."','id':'1'}";//id参数固定不变,仅供演示,实际项目中可以是数据库ID
		}
	}
	else $err='上传文件扩展名必需为:'.$upExt;

	@unlink($tempPath);

}

echo "{'err':'".jsonString($err)."','msg':".$msg."}";


function jsonString($str)
{
	return preg_replace("/([\\\\\/'])/",'\\\$1',$str);
}
function formatBytes($bytes) {
	if($bytes >= 1073741824) {
		$bytes = round($bytes / 1073741824 * 100) / 100 . 'GB';
	} elseif($bytes >= 1048576) {
		$bytes = round($bytes / 1048576 * 100) / 100 . 'MB';
	} elseif($bytes >= 1024) {
		$bytes = round($bytes / 1024 * 100) / 100 . 'KB';
	} else {
		$bytes = $bytes . 'Bytes';
	}
	return $bytes;
}


?>
7.如果是想把图片从控制器上传到七牛

               // 图片上传 
		
		$pic = Input::get('logo');
		uptoQiniu($pic);
		$page->schoolpic = Qiniu.Input::get('logo');//更新数据库

		// 图片上传结束


8.如果想更新七牛的图片,删除旧图

               //图片更新
		$upload=Input::get('logo');
		if($upload!=''){
			$oldPic=$page->schoolpic;//旧图片地址
			$strl=strlen(Qiniu);
			$deletePic=substr($oldPic,$strl);//截取旧图片的文件名
			deleteFromQiniu($deletePic);//删除旧的
			$pic = Input::get('logo');//获取图片名字
			uptoQiniu($pic);//上传至七牛
			$page->schoolpic = Qiniu.Input::get('logo');//更新数据库
		}
		//图片更新结束

还不会普通的上传图片?具体图片怎么上传到Laravel和xheditod怎么使用请看我的另两篇博客~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐