在我的托管webapp图像中,我通过使用带有回形针的image.rb模型来存储物理图像,以及用于存储链接到的图像名称的第二个模型imagelink.rb,创建了一种用于图像去重复以节省存储空间的hackish方式。物理形象。所以在我的imagelink模型中,我使用" belongs_to:image"并在imagelink上添加索引到图像的image_id。 image和imagelink的命名只是ActiveRecord ID的编码版本。
上传图片时,我只需检查它的md5sum,看看图片是否已经存在,如果它确实存在,那么我创建一个新的图像链接ID并使用原始图像的图像ID。否则,我保存图像并创建新的图像ID。这让我有一个像" vb56.jpg"和编码的图像链接,如" vb56.jpg"以及像#34; 4gb7.jpg"它也使用物理图像" vb56.jpg"
很自然地,现在我想要显示原始的物理图像" vb56.jpg"但使用名称" 4gb7.jpg"当从" 4gb7.jpg" ImageLink的。我可以通过为每个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" />
因此,这样做的两个问题是1)这可能会对页面上显示的每个图像的rails服务器创建缓慢和大量请求。 2)这会弄乱我存储会话[:previous_url]以便使用设备登录的方式,这是&#34; session [:previous_url] = request.fullpath&#34;由于每个图像都是一个请求,它将最后请求的图像存储为previous_url而不是用户所在的实际页面。
有没有一种方法可以显示图像而不需要像目前那样做大量的请求?使用&lt;%= image_tag(@ image.image.image.url)%&gt;进行正确的操作显示物理图像会将图像显示为原始文件名,但我希望将文件名显示为图像链接名称,以便物理图像名称始终与图像链接名称相匹配。
我也在做会话[:previous_url]错了吗?有没有更好的方法来捕获页面URL而不是来自页面内的其他请求的URL?