我想将文件从 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 控制器中,我使用以下代码创建新帖子:
@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 http://www.rqna.net/qna/xyxun-paperclip-throws-nohandlererror-with-base64-photo.html
这是 json 的示例:
"{\"account\":{\"first_name\":\"John\",\"last_name\":\"Smith\",\"email\":\"[email protected] /cdn-cgi/l/email-protection\",\"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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)