有人可以告诉我在数据库中保存图像的想法,然后在浏览器上显示该图像。我已经有一些代码和名称存储在数据库中,但路径不能。请帮我重新编写代码并在浏览器上成功显示图像。
我的代码片段:
视图/图像/ index.html.erb
<h1>IMAGE UPLOAD</h1>
<%= form_for @user,:url => {:action => 'save'} do |f| %>
<%= f.text_field :name,placeholder:"Enter your name" %>
Upload your file:<%= f.file_field("uploaded_file") %>
<%= f.submit "Save"%>
<% end %>
视图/图像/ show.html.erb
<h3><%= @user.name %></h3>
<img src="<%= url_for(:action => 'file', :id => @user.id) %>"/>
控制器/ images_controller.rb
class ImagesController < ApplicationController
def index
@user=User.new
end
def save
@user=User.new(user_params)
if @user.save
redirect_to(action: 'show', id: @user.id)
else
render(action: 'index')
end
end
def show
@user = User.find(params[:id])
end
def file
@user = User.find(params[:id])
send_data(@user.data,
filename: @user.name,
disposition: "inline")
end
private
def user_params
params.require(:user).permit(:name, :data)
end
end
模型/ user.rb
class User < ActiveRecord::Base
def uploaded_file=(file_field)
self.name = base_part_of(file_field.original_filename)
self.data = file_field.read
end
def base_part_of(file_name)
File.basename(file_name).gsub(/[^\w._-]/, '')
end
end
的routes.rb
Rails.application.routes.draw do
root 'images#index'
post 'images/save' => 'images#save'
get 'images/show' => 'images#show'
get 'images/file' => 'images#file'
end
迁移/ 20141224051228_create_users.rb
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.binary :data
t.timestamps
end
end
end
请帮我找到合适的输出。谢谢。
答案 0 :(得分:0)
你几乎在那里,但你必须做出一些改变。我还建议您使用paperclip
- (可在此处paperclip找到)进行文件上传,因为它提供了验证和文件格式的便捷方法,还可以裁剪图像而无需编写处理图像的代码。
话虽如此,要使现有代码起作用,您必须进行一些更改。
将模型更改为这样,还会引入另一个名为image_url
class User < ActiveRecord::Base
def uploaded_file=(file_field)
self.name = base_part_of(file_field.original_filename)
self.data = file_field.read
self.image_url = Rails.root + "/public/uploads/" + self.name
end
def base_part_of(file_name)
File.basename(file_name).gsub(/[^\w._-]/, '')
end
end
现在在您的观看中,您可以这样做
<img src="<%= @user.image_url %>"/> and it should work just fine.
这些只是建议,代码未经过测试。希望你明白这个想法