`
amnosa
  • 浏览: 3558 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

图片云存储的技术实现

阅读更多

 

文章转载自杨鑫奇的技术博客

原文地址http://www.cnblogs.com/scotoma/archive/2011/12/05/2276291.html

 

引子
最近很久没有写文章了,主要是忙于公司的项目,也给自己一个深度挖掘的方向,另外生活也出现了很大的变动,现在终于憋不住了。订阅技术博文是技术者必须做的一件事情,每天打开google reader总是会有所发现有所惊喜继而是感慨。本次主要来介绍下图片的云存储方面的技术实现,不管是对于云技术实践,还是降低相关的运维成本,都是很有效果的,不信就往下看吧!

关键字:图片云存储 又拍云存储 PHP图片存储 廉价高速图片存储

正文
上周看了磊哥的文章 又拍云实战 http://www.blogkid.net/archives/2782.html 后很有收获就觉得去试试又拍云存储的服务http://www.upyun.com/,就去注册然后申请试用了。
本次upyun.com的认证方式很让我意外,竟然是客服打电话过来确认,这点服务感觉还是挺好的,从这里感觉还是蛮重视用户的。特别要说的是,今天是星期天我又在这里宣传upyun.com的服务,就和同事说了下,结果他去注册了,竟然在半小时后就接到了客服人员的电话了,感觉这个确认还是很及时的,体验很好,这点感觉还是很不错的。
试用就开始吧,为什么要试用又拍云存储服务呢?这点磊哥的文章中就已经说的很清楚了,这里我做归纳补充下:
1,图片服务器的托管及运维费用挺高的,而且峰值带宽觉得了大部分成本,且运维的软硬成本增大
2,单机达不到CDN功效,需要CDN支持的话,花费就更大了
3,图片的处理及图片的缓存,需要配置nginx的静态缓存图片,需要做系统设计扩展图片类的保存图片及缩略图功能
4,图片的备份,对于图片的备份是个问题需要用rsync同步到备份机器,添加了运维成本和开发成本

基于以上原因,自己开发及部署图片服务的代价还是很大的,所以这个也是极力推荐使用又拍云存储www.upyun.com的原因了,至于大家说的upyun.com是否稳定,磊哥提到的猛买网用了2个月还是没问题的,我也相信@gofeeling和又拍的技术实力的。
如何申请及开通就请详细参看磊哥的博文吧,本篇主要更细致化的讲解技术实现。


首先,设计表结构
id,filename,desc,createtime,status,remoteurl,url,model,user_id
本次主要用到的字段有 filename 及 model
构造图片的访问地址 $staticUrl / $model / $filename
例如: http://img001.img.woshimaijia.com/user/testuser.jpg
考虑到图片表可能进行分表,这里的id使用了 17位的bigint 时间递增

其次,完善图片类
首先图片的处理流程分为如下
1.用户从表单中上传的图片
2.已经上传的图片
现在这2部分的图片都需要迁移到又拍云存储中,而且都需要做本地进行备份。
所以处理的逻辑如下
用户上传 --> 图片保存到WebServer --> 调用ImageUpload类将图片上传到upyun.com --> 更新数据库表
图片读取 --> 获取图片id集合 --> 调用getImage方法拼接URL --> 返回图片URL

下午调试了下实现了一些HTTP REST的图片使用类,主要包含了
上传,下载,删除,查看使用空间
具体代码如下

 

<?php
// +----------------------------------------------------------------------
// | Buddy Framework
// +----------------------------------------------------------------------
// | Copyright (c) 2011 http://buddy.woshimaijia.com All rights reserved.
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | Author: xinqiyang <xinqiyang@gmail.com>
// +----------------------------------------------------------------------
/**
 * Image Upload service
 * use upaiyun.com image service
 * 使用了又拍云存储的图片服务
 * @author xinqiyang
 *
 */
class ImageUpload
{
    protected $_config = array();
    public function __construct()
    {
        $this->_config = C('imageservice');
    }
  
    /**
     * update file to upaiyun.com
     * 上传图片保存到又拍云存储网
     * @param unknown_type $object
     * @param unknown_type $filename
     * @param unknown_type $path
     */
    public function put($object,$filename,$path)
    {
        $postField = file_get_contents((realpath($path)));
        $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'/'.$object.'/'.$filename);
        curl_setopt($process, CURLOPT_POST, 1);
        curl_setopt($process, CURLOPT_POSTFIELDS, $postField);
        curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
        curl_setopt($process, CURLOPT_HTTPHEADER, array('Expect:', "Mkdir:true"));
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
  
    public  function get($object,$filename)
    {
        $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'/'.$object.'/'.$filename);
        curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
  
    public  function delete($object,$filename)
    {
        $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'/'.$object.'/'.$filename);
        curl_setopt($process, CURLOPT_CUSTOMREQUEST, 'DELETE');
        curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
        curl_setopt($process, CURLOPT_HEADER, 0);
        curl_setopt($process, CURLOPT_TIMEOUT, 30);
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
        $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
  
    public  function usage()
    {
         $process = curl_init($this->_config['api'].'/'.$this->_config['bucketname'].'?usage'); 
         curl_setopt($process, CURLOPT_USERPWD, $this->_config['username'].':'.$this->_config['userpass']);
         curl_setopt($process, CURLOPT_HEADER, 0); 
         curl_setopt($process, CURLOPT_TIMEOUT, 30); 
         curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); 
         $result = curl_exec($process);
        $code = curl_getinfo($process, CURLINFO_HTTP_CODE);
        curl_close($process);
        return array('code'=>$code,'info'=>$result);
    }
      
    /**
     * save file or image to upaiyun.com then update db
     * 先保存数据到又拍云存储,然后在更新数据库
     * @param string $model
     * @param string $filename   保存文件名
     * @param mixed $streamFile  流文件或者是图片路径
     * @param bigint $id ID
     * @param bigint $user_id userid
     */
    public  function save($model,$filename='',$streamFile='',$id='',$user_id)
    {
        $result = $this->put($model, $filename,$streamFile);
        $id = empty($id) ? objid() : $id;
        $filename = empty($filename) ? $id : $filename;
        if($result['code'] == 200)
        {
            $array = array(
                'id'=>$id,
                'filename'=>$filename,
                'model'=>$model,
                'status'=> 0,
                'user_id'=>$user_id,
            );
            return ImageService::add($array);
        }
        return $result;
    }
      
    //从缓存获取image表中的 model filename 然后拼接成url 返回
    public  function  display($id)
    {
        $url = $this->_config['url'];
        return $this->_config['url'].ImageService::getImage($id);
    }
  
  
}

结语
其实使用API的方式操作其实会比现在的繁琐一些,保存做WebServer上的文件只是作为一个备份文件的形式存在,等同步到备份地址后删除即可,对于同步到备份服务器后即可进行缩略图的操作,或者是通过upyun的url将用到的图片做download一份到备份服务器即可,另外又拍的存储的价格现在看来还是挺实惠的,感觉非常的不错,推荐大家试用。其他国内更多的靠谱的云产品的出现!

分享到:
评论

相关推荐

    移动云存储技术及应用策略.pdf

    云存储技术可以实现数据的远程存储、备份、同步、共享和管理,相比于传统的本地存储,它具有成本低、扩展性强、可跨平台访问等优点。根据存储的模型和技术特点,云存储技术可以分为块存储、文件存储、对象存储和表...

    上传图片到云存储wepyplugin

    "上传图片到云存储wepyplugin"是一个针对这一问题的有效方法,它利用了Wepy框架的一个插件,实现了将图片上传到云存储服务,如阿里云OSS或腾讯云COS,以此减小程序包的体积。接下来,我们将详细探讨这个知识点。 ...

    js代码实现图片上传阿里云OSS

    阿里云OSS是一个高可用、高可靠的云存储服务,能够为开发者提供安全、稳定的数据存储解决方案。 首先,`plupload` 是一个开源的多模式上传组件,支持HTML5、Flash、Silverlight和HTML4等不同浏览器的上传方式。它的...

    云存储云浓缩快速部署手册

    云存储是指通过网络将数据分散存储在多台独立的设备上,并利用软件技术实现数据管理的一种存储模式。本手册旨在帮助用户快速理解并部署大华监控云存储系统。 #### 二、云存储系统组成 大华云存储系统主要包括以下...

    视频云存储解决方案(高清原版) -精品

    视频云存储解决方案是一种结合了云存储技术与安防监控行业特点的产品,旨在开发出具有特定行业属性的高级视频和图片云存储系统。云存储技术的融合不仅提升了视频内容的安全性和可靠性,还改善了内容的访问效率,使得...

    基于Hadoop的海量图片云存储系统研究与设计.docx

    ### 基于Hadoop的海量图片云存储系统研究与设计 #### 一、研究背景与意义 在当今数字化时代,随着互联网技术和多媒体技术的飞速发展,图像数据的生成和传播速度日益加快,海量图片数据已成为各行业的重要资源。...

    images:图片云存储

    图片云存储是一种基于云计算技术的解决方案,它允许用户将图片数据上传到云端服务器,以便于高效管理和访问。本文将深入探讨图片云存储的概念、优势、工作原理以及相关技术。 一、图片云存储概述 图片云存储是将...

    阿里云存储白皮书.zip

    阿里云存储白皮书是阿里巴巴集团在存储技术领域二十年研发经验的结晶,全面展示了其在云存储产品和服务上的创新与实践。这份白皮书不仅涵盖了基础的存储概念和技术原理,还深入探讨了如何将这些技术应用于实际业务...

    Java实现图片上传

    总结起来,Java实现图片上传涉及的关键技术有:文件操作(File类)、HTTP请求(Multipart编码)、服务器端文件处理(如Apache Commons FileUpload)、存储策略(文件系统或云存储)以及安全性与性能优化(如文件大小...

    阿里云图片上传

    阿里云图片上传服务是阿里云提供的一个高效、稳定且安全的云存储解决方案,它允许开发者通过API或SDK将图片上传到云端,以便于管理和分发。在这个过程中,我们需要了解几个关键概念和技术点。 首先,"alioss"是阿里...

    UCloud云存储技术方案.docx

    该方案通过对象存储(UFile)技术实现海量文件的存储和管理,解决业务架构的文件存储问题,降低存储成本,支持高并发访问,提升终端用户访问体验。 UFile 概念 对象存储(UFile)是为互联网应用提供非结构化文件...

    ASP源码—阿里云OSS云储存上传ASP源码 V1.0 (附配置手册).zip

    OSS是阿里云提供的一个高可用、安全、低成本的云存储服务,可以存储各种类型的数据,如图片、视频、文档等。 ASP是一种经典的服务器端脚本语言,常用于构建动态网站。在ASP源码中,开发者通常会利用VBScript或...

    分布式云存储API规范

    分布式云存储API规范是一套规定了如何进行数据存储和管理的技术标准,它通过一系列的接口和协议,让开发者可以方便地进行云存储操作,如文件上传、下载、信息获取、删除等。分布式云存储API规范的制定考虑了云存储...

    用Java实现的图片加密程序

    10. **安全实践**:在实际应用中,除了技术实现,还需要考虑安全最佳实践,如使用安全的密钥交换协议,避免明文存储密钥,以及定期更换密钥以增强安全性。 以上就是关于"用Java实现的图片加密程序"的一些主要知识点...

    微信小程序图片文件直接上传到百度云

    本教程将详细介绍如何利用微信小程序的API和百度云对象存储服务(BOS)实现图片和视频的上传功能。 首先,我们要了解微信小程序的`wx.uploadFile`接口。这是微信小程序用于上传文件的核心API,它接受一个对象参数,...

    基于分布式文件系统的开源云存储的技术研究.pdf

    南钢科技与管理期刊上发表的文章《基于分布式文件系统的开源云存储的技术研究》讨论了如何通过开源云存储技术来应对这一挑战。 文章首先分析了开源云存储分布式文件系统的技术原理和性能优势。在当前的数据中心架构...

    web技术实现图片上传到后台

    5. **文件存储**:选择合适的文件存储策略,可以是直接存储在服务器硬盘上,或者使用云存储服务如阿里云OSS、AWS S3等。 6. **返回结果**:Servlet处理完后,向客户端发送响应,告知图片上传的结果。如果成功,可以...

    EasyAR实现本地图片通过Http上传云端图库

    而将本地图片上传到云端图库是实现远程识别的关键步骤。 首先,我们要理解EasyAR云图库的功能。云图库允许开发者存储和管理识别图,这些图可以是静态图像或者3D模型。一旦图像上传到云图库,就可以在任何安装了应用...

Global site tag (gtag.js) - Google Analytics