fastDFS中使用php上传文件 -- http上传与下载图片

CleverCode研究完fastDFS后,尝试着使用php上传文件到fastdfs。

1 fastDFS安装

  fastdfs分布式架构配置参考:http://blog.csdn.net/clevercode/article/details/52267080。

  fastdfs使用nginx配置参考:http://blog.csdn.net/clevercode/article/details/52276169。

   fastdfs缩略图生成参考:http://blog.csdn.net/clevercode/article/details/52278482。

 

2 fastDFS中php扩展的安装

 2.1 安装

 

# cd /usr/local/src/fastdfs/FastDFS/php_client
# /usr/local/php5/bin/phpize 
# ./configure --with-php-config=/usr/local/php5/bin/php-config  
# make && make install  
# cat fastdfs_client.ini >> /usr/local/php5/etc/php.ini

 

 

 

2.2 查看是否安装成功

# php -m | grep fastdfs_client

 

2.3 配置fastDFS的client.conf

# vi /etc/fdfs/client.conf

tracker_server=192.168.101.135:22122  
http.tracker_server_port=80 

 

2.4重启pkill php-fpm

 

# pkill php-fpm
# /usr/local/php5/sbin/php-fpm

 

 

 

 

 

3 通过http上传

3.1 上传页面代码

test.php

 

 

<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="upFile" id="upFile" /> 
    <br />
    <input type="submit" name="submit" value="Submit" />
</form>

</body>
</html>


3.2 接收文件php

 

upload.php

 

<?php

//上传附件
function uploadAttach()                                                                            
{/*{{{*/                                                                                                  
    $ret = array();
    $ret['errorcode'] = 0;
    $ret['errormsg'] = '';
    if(!$_FILES || false == isset($_FILES["upFile"]))
    {
        $ret['errorcode'] = 1;
        $ret['errormsg'] = "ERROR:upFile is not set";
        return $ret;
    }

    $file = $_FILES["upFile"];
    if (false == isset($file['tmp_name']) || false == is_file($file['tmp_name']))
    {
        $ret['errorcode'] = 2;
        $ret['errormsg'] = "tmp_name is not file";
        return $ret;
    }
    if (0 == filesize($file['tmp_name']))
    {
        $ret['errorcode'] = 3;
        $ret['errormsg'] = "tmp_name filesize is 0";
        return $ret;
    }

    $curlFile = new CurlFile($file['tmp_name'], $file['type'], $file['name']);  
    $fileSuffix = getSuffix($curlFile->getPostFilename());                                              
    
    $ret['file'] = $file;
    $ret['fileId'] = uploadToFastdfs($curlFile, $fileSuffix);                                                        
    return $ret;
}/*}}}*/                                                                                                  

//获取后缀
 function getSuffix($fileName) 
 {/*{{{*/
     preg_match('/\.(\w+)?$/', $fileName, $matchs);
     return isset($matchs[1])?$matchs[1]:'';
 }/*}}}*/

//上传文件到fastdfs
function uploadToFastdfs(CurlFile $file, $fileSuffix)                                                  
{/*{{{*/                                                                                                  
    $fdfs = new FastDFS(); 
    $tracker = $fdfs->tracker_get_connection();  
    $fileId = $fdfs->storage_upload_by_filebuff1(file_get_contents($file->getFilename()), $fileSuffix);  
    $fdfs->tracker_close_all_connections();    
    return $fileId;
}/*}}}*/                                                                                                  

function start()
{
    $ret = uploadAttach();  
    print_r($ret);
}
start();
?>

 

 

 

 

 

3.3 上传一张图片

 

3.4 上传结果

 

3.5 访问(下载) http://192.168.101.132/group1/M00/00/00/wKhlhVfBiu2AWrzoAAKp3t_hiGI748.png

 

4 curl上传

  3 的http上传方式,需要在每一台php服务器上都按装fastdfs的php扩展。这里通过curl方式,直接上传到具有fastdfs扩展的php服务器上。

curlupload.php

 

<?php
function curl_multipart_post($url, $post_data = array(), $file_fields = array(), $timeout=30)
{/*{{{*/

    $result = array('errno' => 0, 'errmsg' => '', 'result' => '');

    $ch = curl_init();
    //set various curl options first

    // set url to post to
    curl_setopt($ch, CURLOPT_URL, $url);

    // return into a variable rather than displaying it
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    //set curl function timeout to $timeout
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_VERBOSE, false);

    //set method to post
    curl_setopt($ch, CURLOPT_POST, true);

    // disable Expect header
    // hack to make it working
    $headers = array("Expect: ");
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    // initialize result post array
    $result_post = array();

    //generate post string
    $post_array = array();
    $post_strings = array();
    if (!is_array($post_data)) {
        $result['errno'] = 5;
        $result['errmsg'] = 'Params error.';
        return json_encode($result);
        // return false;
    }

    foreach($post_data as $key=>$value) {
        $post_array[$key] = $value;
        $post_strings[] = urlencode($key)."=".urlencode($value);
    }

    $post_string = implode("&", $post_strings);

    // set post string
    // curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);

    // set multipart form data - file array field-value pairs
    if (!empty($file_fields)) {
        foreach($file_fields as $key => $value) {
            if (strpos(PHP_OS, "WIN") !== false) {
                $value = str_replace("/", "\\", $value); // win hack
            }
            $file_fields[$key] = "@".$value;
        }
    }

    // set post data
    $result_post = array_merge($post_array, $file_fields);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $result_post);
    // print_r($result_post);

    //and finally send curl request
    $output = curl_exec($ch);
    $result['result'] = $output;
    // print_r($result);

    if (curl_errno($ch )) {       
        $result['errno'] = curl_errno($ch);
        $result['errmsg'] = curl_error($ch);
        // return false;
    } else {
        // return $result;
    }
    curl_close($ch);
    return $result;
}/*}}}*/

function start()
{
    $url = 'http://192.168.101.132/upload.php';
    $post = array('signature' => 123456);
    $fileFields = array('upFile' => '/data0/webRoot/upload.php');

    $ret = curl_multipart_post($url,$post,$fileFields);

    print_r($ret);
}

start();
?>

 

 

 

 

 

打印结果

技术交流

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值