原链接:
http://blog.csdn.net/clevercode/article/details/52334597
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();
- ?>
打印结果