反馈 通过 API POST photos 时的 BUG

suffering · May 30, 2014 · Last by bindiry replied at July 24, 2015 · 3973 hits

本地测试使用 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 in RubyChinaSPA by Anugarjs 发布 mention this topic. 09 Oct 10:25
You need to Sign in before reply, if you don't have an account, please Sign up first.