如何在Rails中缩短Active Storage的Blob URL?
嘿,我完全懂你说的烦恼——Active Storage默认生成的Blob URL确实又长又臃肿,尤其是像你用ngrok测试的时候,看着特别闹心。下面给你分享两个实用的解决办法,帮你把这些长URL变短:
方法一:自定义短链接(完全可控,适合极致缩短需求)
这个方法需要我们自己搭建短码生成和重定向的逻辑,好处是可以完全自定义短链接的格式和长度:
创建短链接存储模型(如果需要持久化短链接的话)
先生成一个模型来存储短码和对应的Blob ID:rails generate model ShortenedUrl short_code:string blob_id:string rails db:migrate记得给
short_code加唯一索引,避免重复。生成重定向控制器
创建一个控制器来处理短链接的跳转:rails generate controller ShortenedUrls show然后在控制器里实现跳转逻辑:
class ShortenedUrlsController < ApplicationController def show shortened_url = ShortenedUrl.find_by(short_code: params[:short_code]) if shortened_url blob = ActiveStorage::Blob.find(shortened_url.blob_id) # 这里可以根据需求调整disposition,比如:inline是在线打开,:attachment是下载 redirect_to rails_blob_url(blob, disposition: :attachment) else redirect_to root_path, alert: "这个短链接无效哦" end end end配置短链接路由
在config/routes.rb里添加短路径的路由:get '/s/:short_code', to: 'shortened_urls#show', as: :shortened_blob这里的
/s/可以换成你喜欢的前缀,比如/file/都行。在Attachment模型里添加生成短链接的方法
这样你就能方便地调用生成短链接:class Attachment < ApplicationRecord has_one_attached :file def shortened_file_url # 查找或创建对应的短链接记录,生成8位随机字母数字短码 shortened_url = ShortenedUrl.find_or_create_by(blob_id: file.blob.id) do |su| su.short_code = SecureRandom.alphanumeric(8) end # 生成完整的短链接URL,记得替换成你的域名配置 shortened_blob_url(shortened_url.short_code, host: Rails.application.config.action_mailer.default_url_options[:host]) end end之后你只要调用
your_attachment.shortened_file_url,就能得到类似https://your-domain/s/abc123XY的短链接啦。
方法二:用Rails内置的Redirect服务(简单快捷,适合快速缩短)
如果你不想自己写太多代码,Rails 6及以上版本提供了内置的Redirect服务,能直接生成更短的URL,同时还能帮你做访问控制:
配置Storage服务
打开config/storage.yml,添加redirect服务的配置:redirect: service: Redirect # 如果是用云存储(比如S3),还要加上对应存储服务的配置,比如: # service: S3 # access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %> # secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> # bucket: <%= ENV['AWS_BUCKET'] %> # region: <%= ENV['AWS_REGION'] %>切换到Redirect服务
在对应的环境配置文件里(比如config/environments/production.rb),把Active Storage的服务改成:redirect:config.active_storage.service = :redirect这样之后,你调用
file.blob.url生成的URL就会变成类似https://your-domain/rails/active_storage/blobs/redirect/abc123.../11111111.png的格式,比原来的disk路径短很多,而且这个URL会通过你的应用重定向到实际的存储位置,还能方便地添加权限验证(比如只让登录用户访问)。
两种方法各有优势:第一种适合需要极致短的链接或者自定义格式的场景;第二种是Rails官方提供的方案,配置简单,还自带安全控制。你可以根据自己的需求选~
备注:内容来源于stack exchange,提问作者or123456

