新手问题 客户端通过 Rails API 上传图片

thxagain · 2016年08月07日 · 最后由 thxagain 回复于 2016年08月10日 · 4008 次阅读

Hi All

我现在在做一个 Rails API,iOS 客户端调用我的 API 可以将图片上传到云端。

看了一圈一般是使用 carrierwave 来实现,可是由于云端(不是又拍云 阿里云)是公司内部的,没有对应的 carrierwave 上传 gem。

我想到的流程是,通过 API 先将图片保存在 server 端,然后再从 server 端手动上传到云端。想请问一下大家是这么一个流程么?

如果我的理解没错的话,那似乎也不需要 carrierwave 了?

因为我看了 Rails Guides:

uploaded_io = params[:attachments]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
  file.write(uploaded_io.read)
end

这样就可以保存在 server 端了,然后手动发一个 post 请求,将 server 端的图片放到云端就 OK 了。对不对?我没有弄复杂吧?

自己写要注意文件名带路径之类的攻击。

为什么不是客户端直接上传,然后返回 url 给后端?一般用七牛什么的话都是这么做的吧

#1 楼 @Rei 那可以自己使用 carrierwave 保存到服务器端,然后再调用接口 post 到云端。这个流程没问题吧?

#2 楼 @tony612 客户端可能有体积要求,所以想放在服务器端做。我确实搜索到一些解决方案就是交给服务器端做的。

七牛 carrierwave 插件 https://github.com/huobazi/carrierwave-qiniu, 由 @huobazi 提供。

又拍 carrierwave 插件 https://github.com/nowa/carrierwave-upyun

完全没有必要自己再处理。

#4 楼 @lyfi2003 😭 是我们公司自己的云服务,这些都不能用。

之前只有人用 Ruby 封装了一层基本的 HTTP 请求,可以将文件传上去,并没有专门的 carrierwave 的 gem 包。

我觉得可行~重命名一下客户端上传的文件名就行了

第一步:客户端文件上传

用 carrierwave 保存以及简单校验下用户上传的文件,因为图片上传这一块你到时会遇到很多安全问题。你可以看看 Web Application Security Guide/File upload vulnerabilities ,自己写的话你的代码肯定不少。carrierwave 本身支持扩展名校验,不过这个是可以校验的,可以加上 carrierwave-bombshelter ,后者会从文件头里读取图片信息,是更加安全的做法。

第二步:服务器上传到云

这一步你自己实现就没什么好说的了,自己写个 job 异步上传到云存储就好了。

其他方案

如果你们自己的云存储支持客户端文件直传的话,可以考虑 #2 楼 @tony612 说的方案,服务器为客户端发放上传凭证,客户端把上传后得到的 url(或者其他元数据,比如 host、bucket 等)交给服务器端存下来就好了。这种比较直观,也比较省时省力。

#7 楼 @martin91 好的 说得很详细 谢谢

需要 登录 后方可回复, 如果你还没有账号请 注册新账号