开发者社区> 问答> 正文

discuz插件的七牛存储,上传文件后返回的网址是错误的,哪里错了?

求高手帮忙,每次上传后返回的网址是qn:,后面的目录和文件却是正确的,不知哪个配置文件要修改?
附目录文件代码:
io.php
<?php

require_once("http.php");
require_once("auth_digest.php");

// ----------------------------------------------------------
// class Qiniu_PutExtra

class Qiniu_PutExtra
{
    public $Params = null;
    public $MimeType = null;
    public $Crc32 = 0;
    public $CheckCrc = 0;
}

function Qiniu_Put($upToken, $key, $body, $putExtra) // => ($putRet, $err)
{
    global $QINIU_UP_HOST;

    if ($putExtra === null) {
        $putExtra = new Qiniu_PutExtra;
    }

    $fields = array('token' => $upToken);
    if ($key === null) {
        $fname = '?';
    } else {
        $fname = $key;
        $fields['key'] = $key;
    }
    if ($putExtra->CheckCrc) {
        $fields['crc32'] = $putExtra->Crc32;
    }
    if ($putExtra->Params) {
        foreach ($putExtra->Params as $k=>$v) {
            $fields[$k] = $v;    
        }
    }

    $files = array(array('file', $fname, $body, $putExtra->MimeType));

    $client = new Qiniu_HttpClient;
    return Qiniu_Client_CallWithMultipartForm($client, $QINIU_UP_HOST, $fields, $files);
}

function Qiniu_PutFile($upToken, $key, $localFile, $putExtra) // => ($putRet, $err)
{
    global $QINIU_UP_HOST;

    if ($putExtra === null) {
        $putExtra = new Qiniu_PutExtra;
    }

    if (!empty($putExtra->MimeType)) {
        $localFile .= ';type=' . $putExtra->MimeType;
    }

    $fields = array('token' => $upToken, 'file' => '@' . $localFile);
    if ($key === null) {
        $fname = '?';
    } else {
        $fname = $key;
        $fields['key'] = $key;
    }
    if ($putExtra->CheckCrc) {
        if ($putExtra->CheckCrc === 1) {
            $hash = hash_file('crc32b', $localFile);
            $array = unpack('N', pack('H*', $hash));
            $putExtra->Crc32 = $array[1];
        }
        $fields['crc32'] = sprintf('%u', $putExtra->Crc32);
    }
    if ($putExtra->Params) {
        foreach ($putExtra->Params as $k=>$v) {
            $fields[$k] = $v;    
        }
    }

    $client = new Qiniu_HttpClient;
    return Qiniu_Client_CallWithForm($client, $QINIU_UP_HOST, $fields, 'multipart/form-data');
}

// ----------------------------------------------------------
http.php
<?php

require_once("auth_digest.php");

// --------------------------------------------------------------------------------
// class Qiniu_Error

class Qiniu_Error
{
    public $Err;     // string
    public $Reqid;     // string
    public $Details; // []string
    public $Code;     // int

    public function __construct($code, $err)
    {
        $this->Code = $code;
        $this->Err = $err;
    }
}

// --------------------------------------------------------------------------------
// class Qiniu_Request

class Qiniu_Request
{
    public $URL;
    public $Header;
    public $Body;

    public function __construct($url, $body)
    {
        $this->URL = $url;
        $this->Header = array();
        $this->Body = $body;
    }
}

// --------------------------------------------------------------------------------
// class Qiniu_Response

class Qiniu_Response
{
    public $StatusCode;
    public $Header;
    public $ContentLength;
    public $Body;

    public function __construct($code, $body)
    {
        $this->StatusCode = $code;
        $this->Header = array();
        $this->Body = $body;
        $this->ContentLength = strlen($body);
    }
}

// --------------------------------------------------------------------------------
// class Qiniu_Header

function Qiniu_Header_Get($header, $key) // => $val
{
    $val = @$header[$key];
    if (isset($val)) {
        if (is_array($val)) {
            return $val[0];
        }
        return $val;
    } else {
        return '';
    }
}

function Qiniu_ResponseError($resp) // => $error
{
    $header = $resp->Header;
    $details = Qiniu_Header_Get($header, 'X-Log');
    $reqId = Qiniu_Header_Get($header, 'X-Reqid');
    $err = new Qiniu_Error($resp->StatusCode, null);

    if ($err->Code > 299) {
        if ($resp->ContentLength !== 0) {
            if (Qiniu_Header_Get($header, 'Content-Type') === 'application/json') {
                $ret = json_decode($resp->Body, true);
                $err->Err = $ret['error'];
            }
        }
    }
    return $err;
}

// --------------------------------------------------------------------------------
// class Qiniu_Client

function Qiniu_Client_incBody($req) // => $incbody
{
    $body = $req->Body;
    if (!isset($body)) {
        return false;
    }

    $ct = Qiniu_Header_Get($req->Header, 'Content-Type');
    if ($ct === 'application/x-www-form-urlencoded') {
        return true;
    }
    return false;
}

function Qiniu_Client_do($req) // => ($resp, $error)
{
    $ch = curl_init();
    $url = $req->URL;
    $options = array(
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_CUSTOMREQUEST  => 'POST',
        CURLOPT_URL => $url['path']
    );
    $httpHeader = $req->Header;
    if (!empty($httpHeader))
    {
        $header = array();
        foreach($httpHeader as $key => $parsedUrlValue) {
            $header[] = "$key: $parsedUrlValue";
        }
        $options[CURLOPT_HTTPHEADER] = $header;
    }
    $body = $req->Body;
    if (!empty($body)) {
        $options[CURLOPT_POSTFIELDS] = $body;
    }
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    $ret = curl_errno($ch);
    if ($ret !== 0) {
        $err = new Qiniu_Error(0, curl_error($ch));
        curl_close($ch);
        return array(null, $err);
    }
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    curl_close($ch);
    $resp = new Qiniu_Response($code, $result);
    $resp->Header['Content-Type'] = $contentType;
    return array($resp, null);
}

class Qiniu_HttpClient
{
    public function RoundTrip($req) // => ($resp, $error)
    {
        return Qiniu_Client_do($req);
    }
}

class Qiniu_MacHttpClient
{
    public $Mac;

    public function __construct($mac)
    {
        $this->Mac = Qiniu_RequireMac($mac);
    }

    public function RoundTrip($req) // => ($resp, $error)
    {
        $incbody = Qiniu_Client_incBody($req);
        $token = $this->Mac->SignRequest($req, $incbody);
        $req->Header['Authorization'] = "QBox $token";
        return Qiniu_Client_do($req);
    }
}

// --------------------------------------------------------------------------------

function Qiniu_Client_ret($resp) // => ($data, $error)
{
    $code = $resp->StatusCode;
    $data = null;
    if ($code >= 200 && $code <= 299) {
        if ($resp->ContentLength !== 0) {
            $data = json_decode($resp->Body, true);
            if ($data === null) {
                $err_msg = function_exists('json_last_error_msg') ? json_last_error_msg() : "error with content:" . $resp->Body;
                $err = new Qiniu_Error(0, $err_msg);
                return array(null, $err);
            }
        }
        if ($code === 200) {
            return array($data, null);
        }
    }
    return array($data, Qiniu_ResponseError($resp));
}

function Qiniu_Client_Call($self, $url) // => ($data, $error)
{
    $u = array('path' => $url);
    $req = new Qiniu_Request($u, null);
    list($resp, $err) = $self->RoundTrip($req);
    if ($err !== null) {
        return array(null, $err);
    }
    return Qiniu_Client_ret($resp);
}

function Qiniu_Client_CallNoRet($self, $url) // => $error
{
    $u = array('path' => $url);
    $req = new Qiniu_Request($u, null);
    list($resp, $err) = $self->RoundTrip($req);
    if ($err !== null) {
        return array(null, $err);
    }
    if ($resp->StatusCode === 200) {
        return null;
    }
    return Qiniu_ResponseError($resp);
}

function Qiniu_Client_CallWithForm(
    $self, $url, $params, $contentType = 'application/x-www-form-urlencoded') // => ($data, $error)
{
    $u = array('path' => $url);
    if ($contentType === 'application/x-www-form-urlencoded') {
        if (is_array($params)) {
            $params = http_build_query($params);
        }
    }
    $req = new Qiniu_Request($u, $params);
    if ($contentType !== 'multipart/form-data') {
        $req->Header['Content-Type'] = $contentType;
    }
    list($resp, $err) = $self->RoundTrip($req);
    if ($err !== null) {
        return array(null, $err);
    }
    return Qiniu_Client_ret($resp);
}

// --------------------------------------------------------------------------------

function Qiniu_Client_CallWithMultipartForm($self, $url, $fields, $files)
{
    list($contentType, $body) = Qiniu_Build_MultipartForm($fields, $files);
    return Qiniu_Client_CallWithForm($self, $url, $body, $contentType);
}

function Qiniu_Build_MultipartForm($fields, $files) // => ($contentType, $body)
{
    $data = array();
    $mimeBoundary = md5(microtime());

    foreach ($fields as $name => $val) {
        array_push($data, '--' . $mimeBoundary);
        array_push($data, "Content-Disposition: form-data; name=\"$name\"");
        array_push($data, '');
        array_push($data, $val);
    }

    foreach ($files as $file) {
        array_push($data, '--' . $mimeBoundary);
        list($name, $fileName, $fileBody, $mimeType) = $file;
        $mimeType = empty($mimeType) ? 'application/octet-stream' : $mimeType;
        $fileName = Qiniu_escapeQuotes($fileName);
        array_push($data, "Content-Disposition: form-data; name=\"$name\"; filename=\"$fileName\"");
        array_push($data, "Content-Type: $mimeType");
        array_push($data, '');
        array_push($data, $fileBody);
    }

    array_push($data, '--' . $mimeBoundary . '--');
    array_push($data, '');

    $body = implode("\r\n", $data);
    $contentType = 'multipart/form-data; boundary=' . $mimeBoundary;
    return array($contentType, $body);
}

function Qiniu_escapeQuotes($str)
{
    $find = array("\\", "\"");
    $replace = array("\\\\", "\\\"");
    return str_replace($find, $replace, $str);
}

// --------------------------------------------------------------------------------



展开
收起
秋日的私语 2015-07-05 19:03:40 9204 0
4 条回答
写回答
取消 提交回答
  • 楼主可以试试这个插件
    http://kb.qiniu.com/52lqmu6k
    2015-07-06 15:02:59
    赞同 展开评论 打赏
  • 爱好建站
    七牛太抠了 也不做个插件   这样就爽了
    2015-07-06 11:57:24
    赞同 展开评论 打赏
  • 这个问题 该问 discuz 或者七牛
    2015-07-06 10:11:18
    赞同 展开评论 打赏
  • Rediscuz插件的七牛存储,上传文件后返回的网址是错误的,哪里错了?
    rs.php


    <?php

    require_once("http.php");

    define('Qiniu_RSF_EOF', 'EOF');

    /**
    * 1. 首次请求 marker = ""
    * 2. 无论 err 值如何,均应该先看 items 是否有内容
    * 3. 如果后续没有更多数据,err 返回 EOF,markerOut 返回 ""(但不通过该特征来判断是否结束)
    */
    function Qiniu_RSF_ListPrefix(
        $self, $bucket, $prefix = '', $marker = '', $limit = 0) // => ($items, $markerOut, $err)
    {
        global $QINIU_RSF_HOST;

        $query = array('bucket' => $bucket);
        if (!empty($prefix)) {
            $query['prefix'] = $prefix;
        }
        if (!empty($marker)) {
            $query['marker'] = $marker;
        }
        if (!empty($limit)) {
            $query['limit'] = $limit;
        }

        $url =  $QINIU_RSF_HOST . '/list?' . http_build_query($query);
        list($ret, $err) = Qiniu_Client_Call($self, $url);
        if ($err !== null) {
            return array(null, '', $err);
        }

        $items = $ret['items'];
        if (empty($ret['marker'])) {
            $markerOut = '';
            $err = Qiniu_RSF_EOF;
        } else {
            $markerOut = $ret['marker'];
        }
        return array($items, $markerOut, $err);
    }


    -------------------------

    Rediscuz插件的七牛存储,上传文件后返回的网址是错误的,哪里错了?
    rs.php


    <?php

    require_once("http.php");

    // ----------------------------------------------------------
    // class Qiniu_RS_GetPolicy

    class Qiniu_RS_GetPolicy
    {
        public $Expires;

        public function MakeRequest($baseUrl, $mac) // => $privateUrl
        {
            $deadline = $this->Expires;
            if ($deadline == 0) {
                $deadline = 3600;
            }
            $deadline += time();

            $pos = strpos($baseUrl, '?');
            if ($pos !== false) {
                $baseUrl .= '&e=';
            } else {
                $baseUrl .= '?e=';
            }
            $baseUrl .= $deadline;

            $token = Qiniu_Sign($mac, $baseUrl);
            return "$baseUrl&token=$token";
        }
    }

    function Qiniu_RS_MakeBaseUrl($domain, $key) // => $baseUrl
    {
        $keyEsc = rawurlencode($key);
        return "http://$domain/$keyEsc";
    }

    // --------------------------------------------------------------------------------
    // class Qiniu_RS_PutPolicy

    class Qiniu_RS_PutPolicy
    {
        public $Scope;                  //必填
        public $Expires;                //默认为3600s
        public $CallbackUrl;
        public $CallbackBody;
        public $ReturnUrl;
        public $ReturnBody;
        public $AsyncOps;
        public $EndUser;
        public $InsertOnly;             //若非0,则任何情况下无法覆盖上传
        public $DetectMime;             //若非0,则服务端根据内容自动确定MimeType
        public $FsizeLimit;
        public $SaveKey;
        public $PersistentOps;
        public $PersistentNotifyUrl;
        public $Transform;
        public $FopTimeout;
        public $MimeLimit;

        public function __construct($scope)
        {
            $this->Scope = $scope;
        }

        public function Token($mac) // => $token
        {
            $deadline = $this->Expires;
            if ($deadline == 0) {
                $deadline = 3600;
            }
            $deadline += time();

            $policy = array('scope' => $this->Scope, 'deadline' => $deadline);
            if (!empty($this->CallbackUrl)) {
                $policy['callbackUrl'] = $this->CallbackUrl;
            }
            if (!empty($this->CallbackBody)) {
                $policy['callbackBody'] = $this->CallbackBody;
            }
            if (!empty($this->ReturnUrl)) {
                $policy['returnUrl'] = $this->ReturnUrl;
            }
            if (!empty($this->ReturnBody)) {
                $policy['returnBody'] = $this->ReturnBody;
            }
            if (!empty($this->AsyncOps)) {
                $policy['asyncOps'] = $this->AsyncOps;
            }
            if (!empty($this->EndUser)) {
                $policy['endUser'] = $this->EndUser;
            }
            if (!empty($this->InsertOnly)) {
                $policy['exclusive'] = $this->InsertOnly;
            }
            if (!empty($this->DetectMime)) {
                $policy['detectMime'] = $this->DetectMime;
            }
            if (!empty($this->FsizeLimit)) {
                $policy['fsizeLimit'] = $this->FsizeLimit;
            }
            if (!empty($this->SaveKey)) {
                $policy['saveKey'] = $this->SaveKey;
            }
            if (!empty($this->PersistentOps)) {
                $policy['persistentOps'] = $this->PersistentOps;
            }
            if (!empty($this->PersistentNotifyUrl)) {
                $policy['persistentNotifyUrl'] = $this->PersistentNotifyUrl;
            }
            if (!empty($this->Transform)) {
                $policy['transform'] = $this->Transform;
            }
            if (!empty($this->FopTimeout)) {
                $policy['fopTimeout'] = $this->FopTimeout;
            }
            if (!empty($this->MimeLimit)) {
                $policy['mimeLimit'] = $this->MimeLimit;
            }


            $b = json_encode($policy);
            return Qiniu_SignWithData($mac, $b);
        }
    }

    // ----------------------------------------------------------
    // class Qiniu_RS_EntryPath

    class Qiniu_RS_EntryPath
    {
        public $bucket;
        public $key;

        public function __construct($bucket, $key)
        {
            $this->bucket = $bucket;
            $this->key = $key;
        }
    }

    // ----------------------------------------------------------
    // class Qiniu_RS_EntryPathPair

    class Qiniu_RS_EntryPathPair
    {
        public $src;
        public $dest;

        public function __construct($src, $dest)
        {
            $this->src = $src;
            $this->dest = $dest;
        }
    }

    // ----------------------------------------------------------

    function Qiniu_RS_URIStat($bucket, $key)
    {
        return '/stat/' . Qiniu_Encode("$bucket:$key");
    }

    function Qiniu_RS_URIDelete($bucket, $key)
    {
        return '/delete/' . Qiniu_Encode("$bucket:$key");
    }

    function Qiniu_RS_URICopy($bucketSrc, $keySrc, $bucketDest, $keyDest)
    {
        return '/copy/' . Qiniu_Encode("$bucketSrc:$keySrc") . '/' . Qiniu_Encode("$bucketDest:$keyDest");
    }

    function Qiniu_RS_URIMove($bucketSrc, $keySrc, $bucketDest, $keyDest)
    {
        return '/move/' . Qiniu_Encode("$bucketSrc:$keySrc") . '/' . Qiniu_Encode("$bucketDest:$keyDest");
    }

    // ----------------------------------------------------------

    function Qiniu_RS_Stat($self, $bucket, $key) // => ($statRet, $error)
    {
        global $QINIU_RS_HOST;
        $uri = Qiniu_RS_URIStat($bucket, $key);
        return Qiniu_Client_Call($self, $QINIU_RS_HOST . $uri);
    }

    function Qiniu_RS_Delete($self, $bucket, $key) // => $error
    {
        global $QINIU_RS_HOST;
        $uri = Qiniu_RS_URIDelete($bucket, $key);
        return Qiniu_Client_CallNoRet($self, $QINIU_RS_HOST . $uri);
    }

    function Qiniu_RS_Move($self, $bucketSrc, $keySrc, $bucketDest, $keyDest) // => $error
    {
        global $QINIU_RS_HOST;
        $uri = Qiniu_RS_URIMove($bucketSrc, $keySrc, $bucketDest, $keyDest);
        return Qiniu_Client_CallNoRet($self, $QINIU_RS_HOST . $uri);
    }

    function Qiniu_RS_Copy($self, $bucketSrc, $keySrc, $bucketDest, $keyDest) // => $error
    {
        global $QINIU_RS_HOST;
        $uri = Qiniu_RS_URICopy($bucketSrc, $keySrc, $bucketDest, $keyDest);
        return Qiniu_Client_CallNoRet($self, $QINIU_RS_HOST . $uri);
    }

    // ----------------------------------------------------------
    // batch

    function Qiniu_RS_Batch($self, $ops) // => ($data, $error)
    {
        global $QINIU_RS_HOST;
        $url = $QINIU_RS_HOST . '/batch';
        $params = 'op=' . implode('&op=', $ops);
        return Qiniu_Client_CallWithForm($self, $url, $params);
    }

    function Qiniu_RS_BatchStat($self, $entryPaths)
    {
        $params = array();
        foreach ($entryPaths as $entryPath) {
            $params[] = Qiniu_RS_URIStat($entryPath->bucket, $entryPath->key);
        }
        return Qiniu_RS_Batch($self,$params);
    }

    function Qiniu_RS_BatchDelete($self, $entryPaths)
    {
        $params = array();
        foreach ($entryPaths as $entryPath) {
            $params[] = Qiniu_RS_URIDelete($entryPath->bucket, $entryPath->key);
        }
        return Qiniu_RS_Batch($self, $params);
    }

    function Qiniu_RS_BatchMove($self, $entryPairs)
    {
        $params = array();
        foreach ($entryPairs as $entryPair) {
            $src = $entryPair->src;
            $dest = $entryPair->dest;
            $params[] = Qiniu_RS_URIMove($src->bucket, $src->key, $dest->bucket, $dest->key);
        }
        return Qiniu_RS_Batch($self, $params);
    }

    function Qiniu_RS_BatchCopy($self, $entryPairs)
    {
        $params = array();
        foreach ($entryPairs as $entryPair) {
            $src = $entryPair->src;
            $dest = $entryPair->dest;
            $params[] = Qiniu_RS_URICopy($src->bucket, $src->key, $dest->bucket, $dest->key);
        }
        return Qiniu_RS_Batch($self, $params);
    }

    // ----------------------------------------------------------


    -------------------------

    Rediscuz插件的七牛存储,上传文件后返回的网址是错误的,哪里错了?
    qiniu目录文件打包:

    求高手指点啊,非常感谢。现在每次上传后都要手动输入地址太麻烦了。

    -------------------------

    Rediscuz插件的七牛存储,上传文件后返回的网址是错误的,哪里错了?
    阿里云高手云集,有没哪个好心人能帮忙看下原因,非常感谢!现在服务器上的网站就这一个难以忍受的错误了。
    2015-07-05 19:04:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
附件下载测试 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载