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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:15:05