反馈 通过 API POST photos 时的 BUG

suffering · 2014年05月30日 · 最后由 bindiry 回复于 2015年07月24日 · 3385 次阅读

本地测试使用 ruby-china.org 的 api_v2 进行图片上传. 图片上传成功, 但是返回的地址却都是 photo/.jpg. 在console里找到上传的图片 Photo.all.collect{|t| t.image.url}, 返回的地址也全部都是photo/.jpg.

查看 log, 发现 params[:Filedata] 是一个 <Hashie::Mash>. 而 carrierwave 是无法处理它的.

试着将Hashie::Mash转化为ActionDispatch::Http::UploadedFile 对象后上传也失败了.

通过 API POST 的图片对象是:

#<Hashie::Mash Filedata=#<Hashie::Mash filename="4.png" head="Content-Disposition: form-data; name=\"Filedata\"; filename=\"4.png\"\r\nContent-Type: image/png\r\n" name="Filedata" tempfile=#<Tempfile:/var/folders/27/xnmldrkd5f3fq07zvfzb9by00000gn/T/RackMultipart20140530-7213-1t6ys2x> type="image/png"> format="json" route_info=#<Grape::Route:0x0000010443eef0 @options={:prefix=>"api", :version=>"v2", :namespace=>"/photos", :method=>"POST", :path=>"/api/:version/photos(.:format)", :params=>{}, :compiled=>/\A\/api\/(?<version>v2)\/photos(?:\.(?<format>[^\/.?]+))?\Z/}> token="[FILTERED]" version="v2">

hack 后的代码

#api_v2
resource :photos do
    post do
      authenticate!
      filedata = params[:Filedata]
      filedata_hash = {
        :filename => filedata[:filename],
        :orginal_filename => filedata[:filename],
        :type     => filedata[:type],
        :headers  => filedata[:head],
        :tempfile => filedata[:tempfile]
      }

      @photo = Photo.new
      puts "------ #{params.inspect}"
      @photo.image = ActionDispatch::Http::UploadedFile.new(filedata_hash)
      Rails.logger.info @photo.image.inspect
      @photo.user_id = current_user.id
      if @photo.save
        puts "------ #{@photo.inspect}"
        @photo.image.url
      else
        error!({"error" => @photo.errors.full_messages }, 400)
      end
    end
  end

关于这个问题, 是否需要其他方式的 POST, 比如说 BINARY MODE 之类的. 折腾了好久, 一直没能解决这个问题.

>_< 沉了? 沉了? 木有人问答? 木有人回答?

我记得以前写 iOS 的时候是上传成功了的

#2 楼 @suffering 有解决办法了嘛? 我也碰到这个问题了....纠结....

#4 楼 @glorySpring , sorry for that. 我也没找到解决方案. 上面贴出的解决方案都试过了, 木有用. 后来放弃了. rubychinaspa 已经被搁置很久了.

#5 楼 @suffering 我找到了....安装了一个 gem

gem 'rest_client'

1 年过去了,我在用 carrierwave + grape 时,也遇到了这个问题。

suffering RubyChinaSPA by Anugarjs 发布 中提及了此贴 10月09日 10:25
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册