RoR如何通过ActiveStorage API端点下载已存储的文件
问题修复方案
修正模型查询笔误
你当前控制器代码中存在明显的查询对象错误:你要操作的是Path模型的附件,但是下载方法里写的是User.find(params[:id]),首先把这行修改为:path = Path.find(params[:id])
建议额外补充附件存在性校验,避免无附件时报错。正确构造文件下载响应
你不需要手动读取二进制内容再处理,Rails已经提供了封装好的send_blob方法,会自动处理响应头、MIME类型、文件命名等逻辑,大文件场景下还支持流式传输,不会占用过多服务器内存。
修正后的完整控制器代码示例:
class Api::V1::PathsController < ApplicationController # ...其他方法 def download path = Path.find(params[:id]) # 校验附件是否存在 unless path.file_element.attached? return render json: { error: "文件未上传" }, status: :not_found end # 直接调用send_blob返回附件,disposition设置为attachment就是触发下载,设置为inline则是浏览器直接预览 send_blob path.file_element.blob, filename: path.file_element.filename.to_s, disposition: 'attachment' end # ...其他方法 end
- 补充路由配置
需要在config/routes.rb中配置对应的下载路由,示例如下:
Rails.application.routes.draw do namespace :api do namespace :v1 do resources :paths do member do get :download end end end end end
额外注意事项
如果需要手动处理二进制内容,再使用download方法,但是该方法会把整个文件加载到服务器内存中,不建议100M以上的大文件使用该方式。
内容的提问来源于stack exchange,提问作者assembler
相关产品推荐
相关产品推荐

