Rails 一个上传接口,接收 base64 解码出来不是一张图片

sforce100 · 2014年05月18日 · 最后由 linjunzhugg 回复于 2014年12月24日 · 8575 次阅读

使用 CarrierWave 做一个上传图片的接口,要求客户端图片经过 base64 编码。

if params[:picture]["file"]
  picture_path_params = params[:picture]
  tempfile = Tempfile.new("fileupload")
  tempfile.binmode
  tempfile.write(Base64.decode64(picture_path_params["file"]))

  #create a new uploaded file
  uploaded_file = ActionDispatch::Http::UploadedFile.new(:tempfile => tempfile, :filename => picture_path_params["filename"], :original_filename => picture_path_params["original_filename"])
  params[:picture] =  uploaded_file
end
uploader = ChatBase64Uploader.new
uploader.store!(params[:picture])

我做了一个 java 的 demo,上传没问题。

但是 ios 那边传过来的图片解码后总提示不是

Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: Command ("identify -quiet -ping /var/folders/8q/wwnwcmt93lvcynt9_5yjhqrr0000gn/T/mini_magick20140516-77009-1o5zyba.jpg_s") failed: {:status_code=>1, :output=>"identify: IHDR: CRC error `/var/folders/8q/wwnwcmt93lvcynt9_5yjhqrr0000gn/T/mini_magick20140516-77009-1o5zyba.jpg_s' @ error/png.c/MagickPNGErrorHandler/1806.\nidentify: corrupt image `/var/folders/8q/wwnwcmt93lvcynt9_5yjhqrr0000gn/T/mini_magick20140516-77009-1o5zyba.jpg_s' @ error/png.c/ReadPNGImage/4077.\n"}

正在 google 搜问题看到这个......看报错提示,应该是直接处理文件参数的吧,base64 是个字符串,要像 ruby 那样先缓存到文件再去解码

2 楼 已删除

试试这个?

Base64.strict_decode64

确认下编码格式是否一致

因为你的图片 base64 之后,传到服务器,此时已经被转义了,你需要反转义再写入新的文件。

String.class_eval(%Q("#{avatar}")) )
需要 登录 后方可回复, 如果你还没有账号请 注册新账号