使用Paperclip和Multipart请求将文件上载到Rails JSON API服务器

我想将文件从Android客户端上传到Rails JSON API服务器。

我正在从Android客户端发送一个Multipart / form请求,如下所示:

Content-Type: multipart/form-data; boundary=d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5 Host: 10.0.2.2:3000 Connection: Keep-Alive User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) --d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5 Content-Disposition: form-data; name="POSTDATA" Content-Type: application/json; charset=UTF-8 Content-Transfer-Encoding: 8bit {"tags":["test"],"location_id":1,"post":{"content":"test"}} --d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5 Content-Disposition: form-data; name="IMAGEDATA"; filename="testimage.jpg" Content-Type: image/jpeg Content-Transfer-Encoding: binary <BINARY DATA? --d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5-- 

在rails控制器中我用这段代码创建新post:

 @parsed_json = JSON(params[:POSTDATA]) @post = @current_user.posts.new(@parsed_json["post"]) 

如何使Paperclip从多部分表单中保存附件?

我可以这样做:

 if params.has_key?(:IMAGEDATA) photo = params[:IMAGEDATA] photo.rewind @filename = "/tmp/tempfile" File.open(@filename, "wb") do |file| file.write(photo.read) end @post.photo = File.open(@filename) end 

但它看起来不是最好的解决方案,也没有使用多部分请求中传递的文件名。

纯json方法是不传递内容类型的多部分forms,并将文件作为json中的base64编码字符串传递。

我想通了这篇post: http : //www.rqna.net/qna/xyxun-paperclip-throws-nohandlererror-with-base64-photo.html

这是json的一个例子:

 "{\"account\":{\"first_name\":\"John\",\"last_name\":\"Smith\",\"email\":\"john@test.com\",\"password\":\"testtest\",\"avatar\":{\"data\":\"INSERT BASE64 ENCODED STRING OF FILE HERE\",\"filename\":\"avatar.jpg\",\"content_type\":\"image/jpg\"}}}" 

然后在控制器进程中输入这样的头像,然后保存模型。

 def process_avatar if params[:account] && params[:account][:avatar] data = StringIO.new(Base64.decode64(params[:account][:avatar][:data])) data.class.class_eval { attr_accessor :original_filename, :content_type } data.original_filename = params[:account][:avatar][:filename] data.content_type = params[:account][:avatar][:content_type] params[:account][:avatar] = data end end 

所以,我猜你的Post模型看起来像这样:

 class Post < ActiveRecord::Base has_attached_file :photo, :styles => { ... } ... end 

所以你应该能够做到这么简单:

 @post.photo = params[:IMAGEDATA] if params[:IMAGEDATA].present? @post.save if @post.valid? 

它应该保存照片。

如果您需要执行更复杂的操作,请尝试将表单数据重新排列为Paperclip期望格式的数据。 如果你需要深入挖掘, 请查看Paperclip的Paperclip::Attachment类 。

堆栈溢出交叉引用

  • 通过API使用Paperclip保存文件
  • Github的回形针