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

如何使用Ruby Rails在网页端列出服务器文件夹内的文件?

当然可以用Ruby Rails实现!完全不需要把所有文件塞进数据库

其实你想多啦——直接结合Ruby的文件系统方法和Rails的控制器、视图就能轻松实现网页查看文件夹内容,而且这种方式比存数据库更高效(几千个文件批量入库反而会增加复杂度)。下面是一步步的实现方案:

1. 编写控制器处理文件列表和内容读取

首先创建一个FilesController,用来获取文件列表、读取单个文件内容,重点要做好安全校验,防止路径遍历攻击:

class FilesController < ApplicationController
  # 显示所有文件列表
  def index
    # 指定你的文件存储目录(这里假设文件放在Rails根目录下的`docs`文件夹)
    file_dir = Rails.root.join('docs')
    # 获取所有txt文件,按修改时间倒序排列
    @files = Dir.glob(file_dir.join('*.txt')).sort_by { |f| File.mtime(f) }.reverse
    # 如果文件数量极多,可以加缓存优化性能
    # @files = Rails.cache.fetch('file_list', expires_in: 10.minutes) do
    #   Dir.glob(file_dir.join('*.txt')).sort_by { |f| File.mtime(f) }.reverse
    # end
  end

  # 显示单个文件内容
  def show
    file_dir = Rails.root.join('docs')
    target_file = file_dir.join(params[:filename])

    # 安全校验:确保请求的文件确实在指定目录内,防止恶意路径(比如../config/database.yml)
    unless File.realpath(target_file).start_with?(File.realpath(file_dir))
      redirect_to files_path, alert: "无效的文件路径"
      return
    end

    # 读取文件内容(如果是大文件,建议用send_file流式传输,见下方提示)
    if File.exist?(target_file)
      @content = File.read(target_file)
    else
      redirect_to files_path, alert: "文件不存在"
    end
  end
end

2. 配置路由

在config/routes.rb里添加路由,让控制器的方法能被访问:

resources :files, only: [:index, :show]

3. 创建视图展示内容

文件列表页面(app/views/files/index.html.erb)

用来列出所有文件名,点击可查看内容:

<h1>文件列表</h1>
<ul class="file-list">
  <% @files.each do |file| %>
    <li>
      <%= link_to File.basename(file), file_path(filename: File.basename(file)) %>
      <span class="text-muted small">(<%= time_ago_in_words(File.mtime(file)) %> 前修改)</span>
    </li>
  <% end %>
</ul>

文件内容页面(app/views/files/show.html.erb)

展示单个文件的内容:

<h1><%= params[:filename] %></h1>
<% if @content %>
  <pre class="file-content"><%= @content %></pre>
<% else %>
  <p class="text-danger">文件无法读取或不存在</p>
<% end %>
<%= link_to '返回文件列表', files_path, class: 'btn btn-secondary mt-3' %>

额外优化提示

  • 支持多种文件类型:把*.txt改成*.{txt,md,csv}就能同时匹配多种格式,或者用*匹配所有文件。
  • 处理大文件:如果文件很大,不要用File.read(会占满内存),改用send_file流式传输:
    def show
      # 安全校验同上
      if File.exist?(target_file)
        send_file target_file, filename: File.basename(target_file), disposition: 'inline'
      else
        redirect_to files_path, alert: "文件不存在"
      end
    end
    
    这样浏览器会直接渲染文件(比如txt、图片、PDF都能直接显示),更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:14:03