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

Rails 7如何让项目外文件夹的文件支持前端下载?

Rails 7 实现外部文件夹的公开访问与文件下载

针对你的需求,Rails有几种简单的方案,和Phoenix的配置思路类似,下面给你具体步骤:

方案1:直接将外部文件夹加入静态文件服务器路径

适合希望外部文件和public目录文件用相同URL访问的场景(比如/xxx.pdf):

  • 打开对应环境的配置文件(生产环境用config/environments/production.rb,开发环境用config/environments/development.rb)
  • 添加以下配置:
    config.public_file_server.enabled = true
    config.public_file_server.paths << '/绝对路径/到/你的外部文件夹'
    
  • 重启Rails服务后,外部文件夹里的PDF就能像public目录里的文件一样,直接通过文件名访问下载。

方案2:挂载专属URL前缀的静态目录

如果想给外部文件单独设置URL前缀(比如/pdfs/xxx.pdf,避免和public里的文件冲突):

  • 打开config/routes.rb,添加路由挂载:
    mount Rack::Directory.new('/绝对路径/到/你的外部文件夹') => '/pdfs'
    
  • 重启服务后,访问/pdfs/你的文件名.pdf就能下载对应的外部文件。

方案3:通过控制器动作控制下载(适合需要权限验证的场景)

如果后续需要限制某些用户才能下载文件,可以用控制器处理:

  1. 新建控制器文件app/controllers/pdfs_controller.rb:
    class PdfsController < ApplicationController
      # 可选:添加权限验证,比如只允许登录用户下载
      # before_action :authenticate_user!
    
      def download
        file_path = "/绝对路径/到/你的外部文件夹/#{params[:filename]}"
        # 验证文件存在,避免报错
        if File.exist?(file_path)
          send_file file_path, 
                    filename: params[:filename], 
                    type: 'application/pdf',
                    disposition: 'attachment' # 强制下载,而非在线预览
        else
          head :not_found
        end
      end
    end
    
  2. 在config/routes.rb里添加路由:
    get '/pdfs/:filename', to: 'pdfs#download'
    
  3. 重启服务后,访问/pdfs/你的文件名.pdf即可触发下载,还能在控制器里添加各种权限或业务逻辑。

注意事项

  • 确保服务器上的外部文件夹权限正确:Rails进程需要有读取该文件夹及文件的权限,比如Linux下可将文件夹所属组设为www-data,文件夹权限设为755,文件权限设为644。

内容的提问来源于stack exchange,提问作者Akanksha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:12:08