本地测试使用 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 之类的。折腾了好久,一直没能解决这个问题。