ruby-on-rails - 使用 Paperclip 和 Multipart 请求将文件上传到 Rails JSON API 服务器

标签 ruby-on-rails ruby-on-rails-3 paperclip

我想将文件从 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 Controller 中,我正在使用以下代码创建新帖子:
@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 方法是不传递 content-type multipart-form 并将文件作为 json 中的 base64 编码字符串传递。

我想通了,感谢这篇文章: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\"}}}"

然后在 Controller 中像这样在保存模型之前处理传入的头像。
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

关于ruby-on-rails - 使用 Paperclip 和 Multipart 请求将文件上传到 Rails JSON API 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160286/

相关文章:

ruby-on-rails - 我可以更改不同操作所需的验证规则吗?

ruby-on-rails - 在 Rails 中进行通知

ruby-on-rails - 在 Rails 的数据库中将用户输入保存为 xml 文件

ruby-on-rails - Paperclip.Run 和 FFMPEG 退出代码

ruby-on-rails - 使用 ruby​​ 在浏览器中显示 docx 或 ppt

ruby-on-rails - 将 exec 与 heroku bundle 在一起 - 有必要吗?

ruby-on-rails - 自定义分析器 elasticsearch-rails

ruby-on-rails - 来自基类的 Rails STI 条件子类化

ruby-on-rails - Rails 5模型对象未显示所有Devise属性

ruby-on-rails - mod_passenger 选项 - 无效命令