如何使用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流式传输:
这样浏览器会直接渲染文件(比如txt、图片、PDF都能直接显示),更高效。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
内容的提问来源于stack exchange,提问作者jaytea
相关产品推荐
相关产品推荐

