回形针图像上传 (base64) - 出现 500 内部服务器错误(未定义方法 'permit')
Paperclip image upload (base64) - getting 500 internal server error (undefined method 'permit')
我正在尝试使用 Paperclip 上传图片;我尽可能地遵循 paperclip quick start guide,但我做错了什么,无法找出是什么。我是 Ruby 和 Rails 的新手;整个项目是用AngularJS框架设置的。
我正在做的是发送一个包含 base64 编码图像的 POST 请求:
DataService.add("uploads", {image: file}) [...]
服务如下所示:
add: function(type, object) {
return $http.post(API_URL + "/" + type, object) [...]
"file"是base64编码后的图片;我希望大家对 POST 的工作原理有所了解。现在后端:
控制器:
module Api
class UploadsController < ApplicationController
# POST api/uploads
def create
p params
@upload = Upload.create(upload_params)
@upload.save
end
private
def upload_params
params.require(:upload).permit(:image)
end
end
end
型号:
class Upload < ActiveRecord::Base
attr_accessor :content_type, :original_filename, :image_data
before_save :decode_base64_image
has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/storage/images/:style/missing.png", :url => "/:class/:attachment/:id/:style_:basename.:extension"
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
validates :image, :attachment_presence => true
# validates_attachment :image, :size => { :in => 0..100.kilobytes }
protected
def decode_base64_image
if image_data && content_type && original_filename
decoded_data = Base64.decode64(image_data)
data = StringIO.new(decoded_data)
data.class_eval do
attr_accessor :content_type, :original_filename
end
data.content_type = content_type
data.original_filename = File.basename(original_filename)
self.image = data
end
end
end
基本上就是这样 - 我希望我包含了对我的问题很重要的所有内容(这里是第一个问题)。
在使用简单图像进行测试时,出现 500 - 内部服务器错误,请求负载
{"image":"data:image/png;base64,...<base64 code>...}
我理解错误的可能性大在controller/model部分,但我不知道如何解决。
感谢您的帮助:)
编辑:
当使用 Postman 在本地测试时(表单数据,POST,密钥:上传和图像)我得到这个:
Started POST "/api/uploads" for 127.0.0.1 at 2015-06-13 16:34:08 +0200
Processing by Api::UploadsController#create as */*
Parameters: {"upload"=>#<ActionDispatch::Http::UploadedFile:0x00000002f0e108 @tempfile=# <Tempfile:/tmp/RackMultipart20150613-7296-8zu01e.jpeg>, @original_filename="meise.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload\"; filename=\"meise.jpeg\"\r\nContent-Type: image/jpeg\r\n">}
{"upload"=>#<ActionDispatch::Http::UploadedFile:0x00000002f0e108 @tempfile=#<Tempfile:/tmp/RackMultipart20150613-7296-8zu01e.jpeg>, @original_filename="meise.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload\"; filename=\"meise.jpeg\"\r\nContent-Type: image/jpeg\r\n">, "controller"=>"api/uploads", "action"=>"create"}
Completed 500 Internal Server Error in 0ms
NoMethodError (undefined method `permit' for # <ActionDispatch::Http::UploadedFile:0x00000002f0e108>):
app/controllers/api/uploads_controller.rb:16:in `upload_params'
app/controllers/api/uploads_controller.rb:7:in `create'
编辑 2:
它现在可以工作了,但对于遇到同样问题的每个人来说:如果你像我在 DataService 中那样发送 base64 编码的图像并且具有相同的 controller/module 设置,它将与回形针,但不是前端。在
has_attached_file :image, :styles => { :medium => "1000x1000>", :thumb => "150x150#" }, :default_url => "/storage/images/:style/missing.png", :url => "/:class/:attachment/:id/:style_:basename.:extension"
我不得不将最后一部分更改为
"/:class/:attachment/:id/:style_image_:id.png"
因为不知何故名称和扩展名在某处丢失了。我现在使用 id 作为文件名,.png 作为扩展名,因为 base64 是从我在前端创建的 png 创建的。
这一行有问题:
params.require(:upload).permit(:image)
require
确保参数存在。如果存在,returns 给定键的参数。在您的情况下,它返回 ActionDispatch::Http::UploadedFile
没有 permit
方法的对象。
您可以通过删除 require 并在 image
参数中传递文件而不是 upload
:
来解决此问题
params.permit(:image)
如果您想保留现有代码,请让客户端在名称为 upload['image']
的字段中传递图像
在Rails日志中,应该是
Parameters: {"upload"=> { "image" =>#<ActionDispatch::Http::UploadedFile:0x00000002f0e108 @tempfile=# .....}}
注意图片是如何上传的。
我正在尝试使用 Paperclip 上传图片;我尽可能地遵循 paperclip quick start guide,但我做错了什么,无法找出是什么。我是 Ruby 和 Rails 的新手;整个项目是用AngularJS框架设置的。
我正在做的是发送一个包含 base64 编码图像的 POST 请求:
DataService.add("uploads", {image: file}) [...]
服务如下所示:
add: function(type, object) {
return $http.post(API_URL + "/" + type, object) [...]
"file"是base64编码后的图片;我希望大家对 POST 的工作原理有所了解。现在后端:
控制器:
module Api
class UploadsController < ApplicationController
# POST api/uploads
def create
p params
@upload = Upload.create(upload_params)
@upload.save
end
private
def upload_params
params.require(:upload).permit(:image)
end
end
end
型号:
class Upload < ActiveRecord::Base
attr_accessor :content_type, :original_filename, :image_data
before_save :decode_base64_image
has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/storage/images/:style/missing.png", :url => "/:class/:attachment/:id/:style_:basename.:extension"
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/
validates :image, :attachment_presence => true
# validates_attachment :image, :size => { :in => 0..100.kilobytes }
protected
def decode_base64_image
if image_data && content_type && original_filename
decoded_data = Base64.decode64(image_data)
data = StringIO.new(decoded_data)
data.class_eval do
attr_accessor :content_type, :original_filename
end
data.content_type = content_type
data.original_filename = File.basename(original_filename)
self.image = data
end
end
end
基本上就是这样 - 我希望我包含了对我的问题很重要的所有内容(这里是第一个问题)。
在使用简单图像进行测试时,出现 500 - 内部服务器错误,请求负载
{"image":"data:image/png;base64,...<base64 code>...}
我理解错误的可能性大在controller/model部分,但我不知道如何解决。
感谢您的帮助:)
编辑:
当使用 Postman 在本地测试时(表单数据,POST,密钥:上传和图像)我得到这个:
Started POST "/api/uploads" for 127.0.0.1 at 2015-06-13 16:34:08 +0200
Processing by Api::UploadsController#create as */*
Parameters: {"upload"=>#<ActionDispatch::Http::UploadedFile:0x00000002f0e108 @tempfile=# <Tempfile:/tmp/RackMultipart20150613-7296-8zu01e.jpeg>, @original_filename="meise.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload\"; filename=\"meise.jpeg\"\r\nContent-Type: image/jpeg\r\n">}
{"upload"=>#<ActionDispatch::Http::UploadedFile:0x00000002f0e108 @tempfile=#<Tempfile:/tmp/RackMultipart20150613-7296-8zu01e.jpeg>, @original_filename="meise.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"upload\"; filename=\"meise.jpeg\"\r\nContent-Type: image/jpeg\r\n">, "controller"=>"api/uploads", "action"=>"create"}
Completed 500 Internal Server Error in 0ms
NoMethodError (undefined method `permit' for # <ActionDispatch::Http::UploadedFile:0x00000002f0e108>):
app/controllers/api/uploads_controller.rb:16:in `upload_params'
app/controllers/api/uploads_controller.rb:7:in `create'
编辑 2:
它现在可以工作了,但对于遇到同样问题的每个人来说:如果你像我在 DataService 中那样发送 base64 编码的图像并且具有相同的 controller/module 设置,它将与回形针,但不是前端。在
has_attached_file :image, :styles => { :medium => "1000x1000>", :thumb => "150x150#" }, :default_url => "/storage/images/:style/missing.png", :url => "/:class/:attachment/:id/:style_:basename.:extension"
我不得不将最后一部分更改为
"/:class/:attachment/:id/:style_image_:id.png"
因为不知何故名称和扩展名在某处丢失了。我现在使用 id 作为文件名,.png 作为扩展名,因为 base64 是从我在前端创建的 png 创建的。
这一行有问题:
params.require(:upload).permit(:image)
require
确保参数存在。如果存在,returns 给定键的参数。在您的情况下,它返回 ActionDispatch::Http::UploadedFile
没有 permit
方法的对象。
您可以通过删除 require 并在 image
参数中传递文件而不是 upload
:
params.permit(:image)
如果您想保留现有代码,请让客户端在名称为 upload['image']
在Rails日志中,应该是
Parameters: {"upload"=> { "image" =>#<ActionDispatch::Http::UploadedFile:0x00000002f0e108 @tempfile=# .....}}
注意图片是如何上传的。