[Ting's笔记Day7]活用套件carrierwave gem:(2)利用Amazon S3架设图片服务器
来到第7篇了!培养写作习惯真是不容易:)
在我的上一篇文章活用套件carrierwave gem:(1)在Rails实现图片上传功能,上传图片功能已经完成啦!但是目前图片仅能上传在自己的本地文件夹内孤芳自赏。/images/emoticon/emoticon25.gif
如果我们要把网站完整的功能部署到正式环境,让其他网络使用者也可以一起上传图片,势必需要一个图片服务器。目前最主流的Image Host之一算是AWS(Amazon Web Service)里的S3(Simple Storage Service)了。
在这边我们略过申请帐号的过程(需要绑信用卡号,但只要在一年内不超过特定用量就可免费。)
A.安装Fog-AWS Gem与Figaro Gem
为了串接carrierwave上传到Amazon S3的功能,我们回到carrierwave gem在Github的页面Using Amazon S3这个段落好好研究。它要我们在Gemfile里新增gem“fog-aws”,然后在carriewave/intializers下,新增一个档名称叫做carrierwave.rb,。
以它提供的示例程序上写的上来看(leafor):
CarrierWave.configure do |config|
config.fog_provider = 'fog/aws' #required
config.fog_credentials = {
provider: 'AWS',#required
aws_access_key_id: 'xxx',
#required unless using use_iam_profile
aws_secret_access_key: 'yyy',
#required unless using use_iam_profile
use_iam_profile: true,#optional,defaults to false
region: 'eu-west-1',#optional,defaults to 'us-east-1'
host: 's3.example.com',#optional,defaults to nil
endpoint: 'https://s3.example.com:8080' #optional,defaults to nil
}
config.fog_directory = 'name_of_bucket' #required
config.fog_public = false #optional,defaults to true
从研读代码的过程中,我们很容易发现到了里面出现一个使用任何云端上传服务都会有的密钥及安全性的问题!如何避免之后代码备份到Github上,Access Key被全世界的人看光光?
[解决方案]
这时候我们除了fog-aws,还要装一个gem叫做Figaro以解决上述问题。Figaro会帮我们修改Rail的configuration档,用环境变数ENV代替密钥,并产生一个简单的YAML档。
YAML是一种写法优雅,适合表达、编辑数据结构与各种设定档的格式(注意:大小写和TAB键敏感!)。YAML近一步了解:Wiki|简书
现在我们马上来安装gem:
gem 'figaro'
gem“fog-aws”#用双引号,因为里面有特殊字元“-”
然后在terminal跑bundle install,
再重启服务器rails s(安装gem的三大步骤要牢记!)
这样我们一次就装好了figaro和fog-aws两支gem。
接着,按照Figaro主页README.md档的指示,到terminal输入bundle exec figaro install:
tingdeMacBook-Air:yelpdemo tingtinghsu$ bundle exec figaro install
create config/application.yml
append .gitignore
这时候项目就会在config文件夹下产生了新的yml档:config/application.yml。
之后git push项目到git版控服务器如github,figaro这支gem会用.gitignore隐藏好application.yml,帮助我们的私密数据无法被它人观看。
新手如我在修改代码的时候,常常看到一些新名词,例如刚刚的fog-aws,这时候去google一下定义,对于程序构架的理解是很有帮助的。我很好奇为何要用fog(雾?️?)这个名词。ITHome的这篇文章有提到:原来fog(雾运算)是相对于cloud(云计算)。
边缘运算是就近运算的概念,将运算更靠近数据源所在的本地区网(Local Network)内运算,尽可能不用将数据回传云端,以减少数据往返云端的等待时间及降低网络频宽成本。边缘运算通常是在本地端和云端两边交界的附近做运算处理,也就是数据进出区网附近的位置,这么做的目的,在于既可以将运算环境放在本地,同时又可以靠近云端边界附近,借此跟云衔接。毕竟并不是全部的数据都能放在本地端运算,还是会有些需要更进一步分析及判断的数据,
B.在Amazon S3建立新的bucket
Amazon S3的bucket(储存桶)是类似云端文件夹(~雾端文件夹?)的概念。新手推荐
初期接触Amazon S3服务的板友们,我很建议去这个lab按照教学操作,内容设计互动上还挺有趣的~
1.进入Amazon S3 console,按下的create bucket建立bucket。
输入Bucket Name和Region(区域)。注意(bucket是个物件,你的bucket name必须是个unique name和世界上其他人的bucket name都不一样)然指定一个区域(region),不同区域的bucket对于使用者的上传下载速率有显著影响。(原来如此!难怪后文出现了卡bug。)我选了我目
前所在的城市Sydney。
在设定bucket的Permission页面时,一开始对于新手来说,将bucket设定为public是较为容易的学习做法。(如果我们的数据是极为隐密的,就千万不能这样做!)
2.在bucket内按upload上传一张图片(或任何档案),记下所在的host和region。
点开档案,可以看到每个档案都会有属于自己的独特网址。
从这行网址,就可以确认主机s3-ap-southeast-2.amazonaws.com,区域是ap-southeast-2,这两者是我们修改carrierwave.rb所需要的参数。
host:“s3-ap-southeast-2.amazonaws.com”,
region:“ap-southeast-2”
3.在Sercurity Credentials新增Access Key
在右上方点击我们的帐户,菜单上会出现Sercurity Credential(安全凭证)。按下之后,视窗会提醒你接下来的步骤要小心谨慎,按下Continue to Sercurity Credential后出现以下画面:
点选Create New Access Key,然后Download Key File可以下载新建好的Access Key。
C.到项目修改application.yml
我们用记事本打开热腾腾刚打好的钥匙Access Key!在刚刚figaro帮我们制作的application.yml,放入密钥id和access key。
pusher_app_id: '放我的id'
pusher_key: '放我的钥匙'
pusher_secret: '放我的秘密路径'
我们使用的是Amazon S3,所以前面三个pusher修改为:
aws_access_key_id: '放我的刚刚建好的id'
aws_secret_access_key: '放我刚刚建好的key'
fog_directory: '我的Amazon S3 bucket名称'
以此类推,如果你使用Google Cloud,就要换成Google Cloud的变数和相对应的key。YAML对于任何多的空格space或tab都是敏感的,所以输入数据时要特别小心。
D.Config/initializers新增新档carrierwave.rb,代换参数,重启server。
在config/initializers/路径下,新增carrierwave.rb,将carrierwave提供给我们代码贴过去修改,代换刚才提到figaro帮我们做好的ENV[]环境变数:
CarrierWave.configure do |config|
config.fog_provider = 'fog/aws' # required
config.fog_credentials = {
provider: 'AWS',# required
aws_access_key_id: ENV[“aws_access_key_id”],
aws_secret_access_key: ENV[“aws_secret_access_key”],
host:“s3-ap-southeast-2.amazonaws.com”,
region:“ap-southeast-2”
}
config.fog_directory = ENV[“fog_directory”] # required
# optional,defaults to {}
end
这边我们更动到了config档案,记得要重启服务器rails s。
[Bug注意!]
host:“s3-ap-southeast-2.amazonaws.com”,
region:“ap-southeast-2”
这两行要代换成你所选择的Amazon aws服务器主机区域,不然会产生问题(vmwork)!
后来我用关键字Excon::Errors::SocketError Broken pipe(Errno::EPIPE)参考了这篇网志终于搞定!
(跟Amazon S3相关功能的熟悉和随之而来的bug让我卡了两天/images/emoticon/emoticon14.gif)这篇文章的得来不易啊…。
C.修改carriewave的uploader.rb
去app/uploaders/image_uploader.rb,把storage:file加上注释,消去storage:fog的注释,让carriewave知道,现在我们要把图片要上传到Amazon S3去。
class ImageUploader < CarrierWave::Uploader::Base
# Choose what kind of storage to use for this uploader:
# storage:file
storage:fog #Use Amazon S3
end
def store_dir
“uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}”
end
=大功告成!=
试着用本机功能的上传按钮传图片,再点开图片网址确认。
这张照片已经放入Amazon S3的bucket啰!
我很开心地修改3家餐厅的数据,去Amazon S3的bucket确认,图片已经安安稳稳地躺在路径/upload/restaurant/image/餐厅id里了。
下一篇要讲把上传Amazon S3的新功能Deploy部署到Heroku上!
[Ting's笔记Day7]活用套件carrierwave gem:(2)利用Amazon S3架设图片服务器的更多相关文章
- [Ting's笔记Day8]活用套件carrierwave gem:(3)Deploy图片上传功能到Heroku网站
前情提要: 身为Ruby新手村民,创造稳定且持续的学习步调很重要,我用的方法就是一周在IT邦写三篇笔记,希望藉由把笔记和遇到的bug记录下来的过程,能帮助到未来想用Ruby on Rails架站的新手 ...
- [Ting's笔记Day6]活用套件carrierwave gem:(1)在Rails实现图片上传功能
carrierwave是一款经典的图片上传套件,本篇的目标是先在本地端(development)的rails项目试成功gem. (预计中集的进度会练习怎么利用Amazone S3架设图片上传Host, ...
- [Ting's笔记Day9]活用套件Carrierwave gem:(4)使用Imagemagick修改图片大小
前情提要: 这几天我都在实验Carrierwave这套图片上传套件,也顺利部署到Heroku架站正式环境了.:) 接下来我遇到了新的问题:要如何在上传的时候,让Carrierwave gem大型siz ...
- python笔记 - day7
python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblog ...
- [Ting's笔记Day4]将Ruby on Rails项目部署到Heroku
今天想笔记的是把自己写的Ruby on Rails项目部署(Deploy)到Heroku! Heroku是Salesforce公司旗下的云端服务商,支持多种程序语言像是Ruby,PHP,Python等 ...
- [Ting's笔记Day1] Ruby on Rails练习- MacOS安装篇
千里之行,始于足下.喊了要学Ruby on Rails好久,今天终于要来迈向第一步:安装了! 一开始学习新的事物,主要就是跟着这个网页所说的步骤step by step. 很喜欢这个网页的设计流程,透 ...
- python学习笔记1-python相关应用套件
完整的数据分析套件 统计科学计算 Numpy,Scipy,statsmodels 深度学习 TensorFlow,MXNET 结构化数据处理与分析 Pandas 大数据处理 PySpark 数据探索编 ...
- [Ting's笔记Day5]在部署到Heroku之前,将Rails项目从SQLite设定为PostgreSQL
前情提要: Paas(平台及服务)公司Heroku是个可以把我们写好的App部署到网际网络的好地方.而本篇是我从自己的上一篇文章:将Ruby on Rails项目部署到Heroku遇到的问题,当时困扰 ...
- [Ting's笔记Day3]解决Git常见错误non-fast-forward问题
写文章最难的部分,是找题材! 所以最近每次遇到bug或错误都挺兴奋开心(zflwx)的,因为又可以写笔记了 也可以记录新手学习之路上遇到的常见问题,提供其他新手参考. 最近学Udemy平台Ruby学习 ...
随机推荐
- jenkins 持续集成iOS开发
持续集成即Continuous Integration,简称CI 1,安装jenkins,brew install jenkins 2,在浏览器输入localhost:8080会出现一个网页,要求输入 ...
- 关于Ctime库
--------------------- 本文来自 Fuko_Ibuki 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_31908675/article/de ...
- django中向用户发送邮件信息
发送邮件来让用户激活,因此,邮件中需要包含用户信息.但用户信息需要加密才可以.因此加密采用的是itsdangerous中的TimedJSONWebSignatureSerializer. 参考链接:h ...
- 在Win10上使用Visual Studio2015的Android模拟器
在Win10上使用Visual Studio2015的Android模拟器 装上win10后,安装了强大的VS2015,不仅可以开发Windows应用,还可以开发Android和iOS应用,简直神器啊 ...
- 三、tcp、ip协议详细
1. 什么是 TCP/IP? TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议 1) 网络接口层: 主要是指物理层次的一些接口,比如电缆等 ...
- Linux中“零拷贝”
服务器响应一个http请求的步骤 把磁盘文件读入内核缓冲区 从内核缓冲区读到内存 处理(静态资源不需处理) 发送到网卡的内核缓冲区(发送缓存) 网卡发送数据 数据从第一步中的内核缓冲区到第四步的内核缓 ...
- etcd和redis的比较和日常使用场景
转自https://blog.csdn.net/weixin_41571449/article/details/79429511 个人观点:etcd的红火来源于kurbernetes用etcd做服务发 ...
- Ubuntu 下解压tar.xz方法
参考地址:https://www.cnblogs.com/baby123/p/6611169.html
- TF(3): 安装部署_Windows
CUDA: CUDA(Compute Unified Device Architecture): CUDA™是一种由显卡厂商NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题. ...
- 由override 和 overload 引发的学习感悟
工作已三年的我,竟然面试的时候去裸考了.想当然的认为有很多东西会在工作中不知不觉积累下来,现在想想,真是扯淡... 我的三年的工作经验是开发测试的工作,主要负责测试用例的自动化实现,稍深一些的是自动化 ...