Rails Rails 上传大的文件

zqalyc · 2013年11月12日 · 最后由 bajiudongfeng 回复于 2016年03月18日 · 6527 次阅读

请问我要通过 rails 的 form 上传 100M 的文件到另外一个‘文件服务器’中,我不想在本地服务器保存,我想直接上传到‘文件服务器’,需要怎么办? 这个‘文件服务器’上传时对外提供了一个接口,直接输入一个文件的地址就可以上传。我现在的做法是先上传到运行 rails 项目的服务器上,然后把保存的路径传给‘文件服务器’的接口进行上传。 还有一种思路: 当我的服务器接收文件的时候,我获取传到后台的 form 表单的数据流,然后向文件服务器发起连接,然后读一点写一点,直接写到文件服务器中,这种可以么?我在后台获取了表单传过来的 file_field 字段的值:params[:inspection_report]['inspection_file'].tempfile 接下来怎么弄? 哪位朋友有好的方法,给个思路,谢谢

使用 CarrierWave,它支持后端存储到不同的地方。

#1 楼 @qichunren 我现在用的就是 CarrierWave,显示上传到本地服务器然后再上传到文件服务器,这样效率很慢,请问你说的是这几在 uploader 文件中上传吗

Ruby 还真不知道,Node.js 里把两个流做个 pipe 就行了

估计用 rails 不行,你得单独用异步 IO 的 gem 写一个,不过感觉复杂度真的好高。

当接收到 form 请求的时候,就得生成一个 url 供文件服务器调用. 文件服务器调用时,你拿到之前的 form 的 io 对象,这时边读边写. 但如果文件服务器过了很久才出访问,这时 form 的请求肯定是超时断开. 或文件服务器连接时中断,你是没有办法再读取文件已读的部分。

可以考虑用 baidu 网盘之类的,通过 api 接口,直接用 iframe 上传。之后用一些第三方接口获取一个 8 小时的下载地址,再把这个地址通知给文件服务器

挂载一个盘符到你那个服务器上去。。。哇嘎嘎,我瞎猜的

#6 楼 @badboy 呵呵,以后会把文件服务器挂载到这个项目中,那样就方便了,但是目前不这样弄

@zqalyc 呃,carrierwave 考虑到大文件上传,可以关闭 cache store

def move_to_cache
  false
end

#8 楼 @kee 已经不用 carrierwave 了,在前台用 jquery-filed-upload,后台用 mini_magick 处理,这样也很方便

10 楼 已删除

#9 楼 @zqalyc 最后你的文件是上传到文件服务器的吗?

#11 楼 @bajiudongfeng 传到阿里云文件服务器了

#12 楼 @zqalyc 这个你最后是咋解决的啊?遇到了和你相同的问题。谢谢。

#13 楼 @bajiudongfeng webuploader 你看一下这个,有分片上传功能

#14 楼 @zqalyc 好的,谢谢啦。

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