【问题标题】:Remote URL uploading with Paperclip使用 Paperclip 远程上传 URL
【发布时间】:2015-12-14 14:39:59
【问题描述】:

我正在尝试允许用户通过远程 URL 上传图片。

我正常的选择文件图片上传工作正常。

我在提交 URL 上传的图像时收到回滚事务。

日志:

Started POST "/images" for 127.0.0.1 at 2015-09-16 23:33:52 -0600
Processing by ImagesController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"rYIESJ0zLKaXx1ci+9utsZUxEEBs8rS5eanKvYoz4zoESAgqI8 AaPlyy00SlmStBJMYt4RRiAsv+v4ksuWGdeA==", "image"=>{"image_url"=>"http://bangalorefoodfete.com/wp-content/uploads/2015/09/food-61.jpg"}, "commit"=>"Submit Photo"}
  (0.1ms)  BEGIN
  (0.2ms)  ROLLBACK
  (0.1ms)  BEGIN
  (0.3ms)  ROLLBACK
  Rendered images/new.html.erb within layouts/application (0.9ms)
  Rendered layouts/_head.html.erb (7.3ms)
  Rendered layouts/_navigation_links.html.erb (0.4ms)
  Rendered layouts/_navigation.html.erb (1.3ms)
  Rendered layouts/_messages.html.erb (0.1ms)
  Completed 200 OK in 5398ms (Views: 48.2ms | ActiveRecord: 0.8ms)

编辑:

收到错误消息。

图片远程网址无效或无法访问

此通知摘自这里:

image.rb:

validates_presence_of :image_remote_url, :if => :image_url_provided?, :message => 'is invalid or inaccessible'

Image.rb:

require 'open-uri'

class Image < ActiveRecord::Base

has_attached_file :image, 
:path => ":rails_root/public/system/:attachment/:id/:style/:filename",

:url => "/system/:attachment/:id/:style/:filename", 
:styles => { :medium => "600x600>", :thumb => "100x100#" }

before_validation :download_remote_image, :if => :image_url_provided?

validates_attachment :image,
content_type: { content_type: ["image/jpeg",       "image/jpg", "image/gif", "image/png"] }


validates_presence_of :image_remote_url, :if => :image_url_provided?, :message => 'is invalid or inaccessible'

private

 def image_url_provided?
 !self.image_url.blank?
end

def download_remote_image
 io = open(URI.parse(image_url))
 self.original_filename = io.base_uri.path.split('/').last
 self.image = io
 self.image_remote_url = image_url
 rescue # catch url errors with validations instead of exceptions    (Errno::ENOENT, OpenURI::HTTPError, etc...)
end
end

相关new.html.erb:

<%= form.text_field :image_url %><br>

images_controller.rb:

lass ImagesController < ApplicationController
 before_action :find_image, only: [:show]

 def new
   @image = Image.new
 end  


 def create
  @image = Image.create( user_params )


   if @image.save
     redirect_to @image

   else
     render 'new'

   end
  end

  def show

  end  


  private

  def user_params
   params.require(:image).permit(:image, :title, :description, :image_remote_url, :image_url)
  end  

 def find_image

    @image = Image.find(params[:id])

  end
end

相关架构.rb:

create_table "images", force: :cascade do |t|
   t.string   "title"
   t.text     "description"
   t.datetime "created_at",         null: false
   t.datetime "updated_at",         null: false
   t.string   "image_file_name"
   t.string   "image_content_type"
   t.integer  "image_file_size"
   t.datetime "image_updated_at"
   t.string   "image_url"
   t.string   "image_remote_url"
end

我正在运行带有 Paperclip v4.3 的 Rails 4.2.4。

任何帮助将不胜感激。

解决方案:

在 models/image.rb 我改变了:

def download_remote_image
io = open(URI.parse(image_url))
self.original_filename = io.base_uri.path.split('/').last
self.image = io
self.image_remote_url = image_url
 rescue
end
end

到这里:

 def download_remote_image
io = open(URI.parse(image_url))
self.original_filename = io.base_uri.path.split('/').last
self.image = io
self.image_remote_url = image_url

end
end

我删除了救援,创建了一个迁移来将 original_filename 添加到我的图像表中,然后繁荣,问题解决了!

【问题讨论】:

  • 您在这里遇到的问题是什么?
  • 哇 抱歉,完全忘记添加问题了。基本上我在图像上获得回滚事务,它将上传,然后回滚,上传然后回滚,然后用missing.jpg而不是图像导航到显示操作
  • 删除 download_remote_url 函数中的所有代码并仅添加一行 'self.image = open(image_url)' 并在最顶部写下这一行 require 'rest-open-uri'
  • 无法加载此类文件 -- rest-open-uri
  • 你需要安装这个gem才能使用它github.com/rfletcher/rest-open-uri

标签: ruby-on-rails ruby upload paperclip


【解决方案1】:

ROLLBACK 通常是由验证错误引起的。将其放在您的 new.html.erb 顶部以显示您的验证错误:

<% if @image.errors.any? %>
  <% @image.errors.full_messages.each do |message| %>
     <p> <%= message %> </p>
  <% end %>
<% end %> 

根据您的代码,只有在下载图像时出现网络错误时,您才会收到验证错误Image remote url is invalid or inaccessible

您可以删除您的 rescue 行以进行调试,看看您会遇到什么样的错误。

我收到此错误:未定义方法 `original_filename=' for #

此行会导致您的错误:

self.original_filename = io.base_uri.path.split('/').last

如果您不需要存储original_filename,只需删除该行。否则将此列添加到您的 images 表中:

$ rails g migration AddOriginalFilenameToImages original_filename
$ rake db:migrate

【讨论】:

  • 好的,做到了。我在
  • 中得到的是图像远程 url 无效或无法访问。某些原因导致它无法通过验证,但它不会告诉我那是什么。
  • 我已经检查了我的 validates_attachment,那里一切似乎都很好。不知道还有什么可能导致它抛出那个味精。你能在代码中看到什么吗?
  • 您能否用您得到的错误的确切文本更新您的问题?
  • @Colinm 删除rescue 行时是否有任何新错误?
  • @Colinm 嗯!你的表没有original_filename 列吗?
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签