php上传图片为云存储(base64编码实现)

作者:Liaodeity - 2016年03月29日

    在多个网站的项目下,云存储图片是一个现在比较好的图片存储方式,但是如果用一些第三方的会考虑到一些问题限制的,我摘要了处理云存储的实现,可以对图片进行统一管理,搭建图片服务器等,加大带宽,不会因为网站因为图片拖慢了浏览的响应时间。

以下代码在ThinkPHP下实现云存储的过程(复制到原生PHP,一样可以执行),在一些目录等结构上,可能没有进行非常严格的限制处理,但是一般情况下,都不会导致大问题的实现,代码是可以完美跑通的。

上传图片客户端

<?php
namespace Home\Controller;
use Think\Controller;
/**
 * 建百站 www.jianbaizhan.com
 */
class PicController extends Controller{
    public function index(){

        $imgs = ['logo.png','Public/Home/images/book.png'];
        $url = 'http://localhost:888/root/UploadDo/upload';
        $ret = [];
        foreach($imgs as $v) {
            $_fp = fopen($v, 'r') or die('cant open file');
            $_basecode = base64_encode(fread($_fp, filesize($v)));
            fclose($_fp);

            $_ret = $this->request($url, ['fileAddress' => '/'.$v, 'file' => $_basecode], 'post');
            $_ret = json_decode($_ret, true);
            $info['code'] = $_ret['code'];
            if ($_ret['code'] == 0) {
                $info['imgUrl'] = $_ret['data']['imageUrl'];
            } else {
                $info['desc'] = $_ret['desc'];
            }
            
            $info['fileAddress'] = $v;
            $ret[] = $info;
        }

        var_dump($ret);
    }
    public function request($url, $params = array(), $method = 'GET', $multi = false, $extheaders = array()) {
        if (!function_exists('curl_init'))
            E('Need to open the curl extension');
        $method  = strtoupper($method);
        $ci      = curl_init();
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 3);
        curl_setopt($ci, CURLOPT_TIMEOUT, 3);
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ci, CURLOPT_HEADER, false);
        $headers = (array) $extheaders;
        switch ($method) {
            case 'POST':
                curl_setopt($ci, CURLOPT_POST, TRUE);
                if (!empty($params)) {
                    if ($multi) {
                        foreach ($multi as $key => $file) {
                            $params[$key] = '@' . $file;
                        }
                        curl_setopt($ci, CURLOPT_POSTFIELDS, $params);
                        $headers[] = 'Expect: ';
                    } else {
                        curl_setopt($ci, CURLOPT_POSTFIELDS, http_build_query($params));
                    }
                }
                break;
            case 'DELETE':
            case 'GET':
                $method == 'DELETE' && curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
                if (!empty($params)) {
                    $url = $url . (strpos($url, '?') ? '&' : '?')
                            . (is_array($params) ? http_build_query($params) : $params);
                }
                break;
        }
        curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE);
        curl_setopt($ci, CURLOPT_URL, $url);
        if ($headers) {
            curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
        }

        $response = curl_exec($ci);
        curl_close($ci);
        return $response;
    }
}

接受图片服务器端

<?php
namespace Home\Controller;
use Common\Controller\AddonController;
/**
 * 建百站 www.jianbaizhan.com
 */
class UploadDoController extends AddonController {
    public function upload(){
        $fileAddress = I('fileAddress');
        $file = I('file');
        $_fp = base64_decode($file);
        $user_dir = 'test/';
        $fileAddress = $user_dir.$fileAddress;
        $fileAddress = str_replace('//', '/', $fileAddress);
        if(!file_exists(dirname($fileAddress))){
            $this->createDir(dirname($fileAddress));
        }
        
        $fp = fopen($fileAddress, 'w');
        $res = fwrite($fp,$_fp);
        if($res){
            $data['code'] = 0;
            $data['data']['imageUrl'] = 'http://www.jianbaizhan.com/'.$fileAddress;
        }else{
            $data['code'] = 1;
            $data['desc'] = 'error';
        }
        fclose($fp);
        echo json_encode($data);
        
    }
    /**
     * 建立文件夹
     *
     * @param string $aimUrl
     * @return viod
     */
    function createDir($aimUrl) {
        $aimUrl = str_replace('', '/', $aimUrl);
        $aimDir = '';
        $arr = explode('/', $aimUrl);
        $result = true;
        foreach ($arr as $str) {
            $aimDir .= $str . '/';
            if (!file_exists($aimDir)) {
                $result = mkdir($aimDir);
            }
        }
        return $result;
    }
}





本文作者: Liaodeity

本文链接: https://www.jianbaizhan.com/article/373

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!


 请勿发布不友善或者负能量的内容。审查将对发布广告等违规信息进行处罚!