Ruby on rails 如何使用与物理文件名不同的文件名显示图像?

Ruby on rails 如何使用与物理文件名不同的文件名显示图像?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在我的图像托管webapp中,我创建了一种用于图像重复数据消除以节省存储空间的黑客方法,使用带有回形针的image.rb模型存储物理图像,使用第二个模型imagelink.rb存储链接到物理图像的图像名称。因此,在我的imagelink模型中,我使用“归属于:图像”,并在imagelink上为图像的图像id添加索引。图像和imagelink的命名只是ActiveRecord ID的编码版本 上载图像时,我只需检查它的md5sum,查看图像是否已经存在。如果确实存在,则创建一个新的imagelin

在我的图像托管webapp中,我创建了一种用于图像重复数据消除以节省存储空间的黑客方法,使用带有回形针的image.rb模型存储物理图像,使用第二个模型imagelink.rb存储链接到物理图像的图像名称。因此,在我的imagelink模型中,我使用“归属于:图像”,并在imagelink上为图像的图像id添加索引。图像和imagelink的命名只是ActiveRecord ID的编码版本

上载图像时,我只需检查它的md5sum,查看图像是否已经存在。如果确实存在,则创建一个新的imagelink ID并使用原始图像的图像ID。否则,我将保存图像并创建一个新的图像ID。这允许我拥有一个物理图像(如“vb56.jpg”)和一个编码图像链接(如“vb56.jpg”),以及第二个图像链接(如“4gb7.jpg”),它也使用物理图像“vb56.jpg”

因此,现在我自然希望显示原始物理图像“vb56.jpg”,但从“4gb7.jpg”图像链接访问时使用名称“4gb7.jpg”。我可以通过对每个imagelink发出另一个请求来实现这一点,该请求类似于:

images_controller.rb
before_action :set_image, only: [:show, :show_direct]

def show_direct
  path = @image.image.image.url
  url = Rails.root.join('uploads' + path)
  send_file url, type: @image.image.image_content_type, disposition: 'inline'
end

def set_image
  @image = ImageLink.decode(params[:id])
  raise 'image not found' if @image.nil?
end


image_view.html.erb
<%
  id = @image.encoded_id
  ext = @image.image.extension
%>
<img src="<%= MYAPP::DOMAIN %><%= id %>.<%= ext %>" class="image-display" />
images\u controller.rb
在\u操作之前:设置\u图像,仅:[:显示,:显示\u直接]
直接显示
path=@image.image.image.url
url=Rails.root.join('uploads'+路径)
发送文件url,类型:@image.image.image\u内容\u类型,处置:“内联”
结束
def set_图像
@image=ImageLink.decode(参数[:id])
如果@image.nil,是否引发“未找到图像”?
结束
image_view.html.erb
“class=”图像显示“/>
这样做有两个问题:1)对于页面上显示的每个图像,这可能会导致速度变慢,并且会向rails服务器发出大量请求。2)这会破坏我存储会话[:previous\u url]的方式,以便使用designe登录,即“session[:previous\u url]=request.fullpath”“因为每个图像都是一个请求,所以它将最后一个请求的图像存储为上一个url,而不是用户所在的实际页面

有没有一种方法可以让我显示图像而不需要像现在这样发出大量的请求?以正确的方式显示物理图像将以原始文件名的形式显示图像,但我希望将文件名显示为imagelink名称,以便对用户而言,物理图像名称始终与imagelink名称匹配


我的会话[:previous_url]是否也错了?是否有更好的方法来捕获页面URL而不是来自页面内的其他请求的URL?

您使用的是
carrierwave
还是
回形针
?Carrierwave有一个内置功能,允许您随机选择每个照片上传的名称,这样即使您端的照片名称相同,每个照片也会有所不同。我会简化,只需将图像的url存储在您的
images
表中即可。您只是增加了一层复杂性,去掉连接将有助于提高性能。随着您的发展,您很可能需要使用像S3这样的CDN,而使用rails作为路由器来服务静态资产的扩展性不好。我还将使用快速哈希算法生成文件名,因为您当前的解决方案可能会导致竞争条件和。@miler350-我使用的是回形针。但问题是没有两个名称相同的图像,因为这些图像将始终使用唯一的编码ID保存。可以说,我试图创建假图像,以便通过使用多个图像链接来节省存储空间,如果上传的是同一图像,则所有图像链接都指向同一图像。@max-只是为了确保我的阅读正确,你是说尝试消除重复图像不值得吗?我应该放弃imagelink模型,只允许保存多个图像,即使它们是相同的图像?我想这会让事情变得简单很多,但对于同一张图像,它可能会占用GB的存储空间。您使用的是
carrierwave
还是
回形针
?Carrierwave有一个内置功能,允许您随机选择每个照片上传的名称,这样即使您端的照片名称相同,每个照片也会有所不同。我会简化,只需将图像的url存储在您的
images
表中即可。您只是增加了一层复杂性,去掉连接将有助于提高性能。随着您的发展,您很可能需要使用像S3这样的CDN,而使用rails作为路由器来服务静态资产的扩展性不好。我还将使用快速哈希算法生成文件名,因为您当前的解决方案可能会导致竞争条件和。@miler350-我使用的是回形针。但问题是没有两个名称相同的图像,因为这些图像将始终使用唯一的编码ID保存。可以说,我试图创建假图像,以便通过使用多个图像链接来节省存储空间,如果上传的是同一图像,则所有图像链接都指向同一图像。@max-只是为了确保我的阅读正确,你是说尝试消除重复图像不值得吗?我应该放弃imagelink模型,只允许保存多个图像,即使它们是相同的图像?我想这会让事情变得简单很多,但对于同一个图像,这可能会占用GBs的存储空间。