You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails中缩短Active Storage的Blob URL?

如何在Rails中缩短Active Storage的Blob URL?

嘿,我完全懂你说的烦恼——Active Storage默认生成的Blob URL确实又长又臃肿,尤其是像你用ngrok测试的时候,看着特别闹心。下面给你分享两个实用的解决办法,帮你把这些长URL变短:

方法一:自定义短链接(完全可控,适合极致缩短需求)

这个方法需要我们自己搭建短码生成和重定向的逻辑,好处是可以完全自定义短链接的格式和长度:

  1. 创建短链接存储模型(如果需要持久化短链接的话)
    先生成一个模型来存储短码和对应的Blob ID:

    rails generate model ShortenedUrl short_code:string blob_id:string
    rails db:migrate
    

    记得给short_code加唯一索引,避免重复。

  2. 生成重定向控制器
    创建一个控制器来处理短链接的跳转:

    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
    
  3. 配置短链接路由
    在config/routes.rb里添加短路径的路由:

    get '/s/:short_code', to: 'shortened_urls#show', as: :shortened_blob
    

    这里的/s/可以换成你喜欢的前缀,比如/file/都行。

  4. 在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,同时还能帮你做访问控制:

  1. 配置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'] %>
    
  2. 切换到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 09:33:09