回形针图像上传(base64) - 获取500内部服务器错误(未定义方法' permit')

时间:2015-06-13 11:51:57

标签: ruby-on-rails ruby file-upload paperclip

我尝试使用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) [...]

"文件"是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>...}

我知道错误最有可能出现在控制器/模型部分,但我不知道如何解决这个问题。

感谢您的帮助:)

修改

当使用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:

现在可以使用,但对于遇到同样问题的每个人:如果您正在发送base64编码的图像,就像我在DataService中执行它并具有相同的控制器/模块设置一样,它将适用于回形针,但没有前端。在

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创建的。

1 个答案:

答案 0 :(得分:1)

问题在于这一行:

params.require(:upload).permit(:image)

require确保存在参数。如果它存在,则返回给定键的参数。在您的情况下,它返回的ActionDispatch::Http::UploadedFile对象没有permit方法。

您可以通过删除require并在image参数而不是upload中传递文件来解决此问题:

params.permit(:image)

如果您想保留现有代码,请让客户端在名为upload['image']

的字段中传递图片

在Rails日志中,它应该像

Parameters: {"upload"=> { "image" =>#<ActionDispatch::Http::UploadedFile:0x00000002f0e108 @tempfile=# .....}}

注意图片是如何上传的。