如何获取本地存储的ActiveStorage文件的磁盘路径?
获取ActiveStorage本地存储文件的磁盘路径
我太懂这种从Paperclip转ActiveStorage的困惑了!之前Paperclip的user.avatar.path直接给磁盘路径用着超顺手,换成ActiveStorage后用rails_blob_path踩坑太正常了——因为它返回的是Web访问用的URL路径,不是本地磁盘的物理路径,这就是你碰到No such file or directory错误的原因。
针对本地存储(也就是Rails默认的:local服务),给你两个实用的解决方法:
1. 直接获取本地磁盘路径
对于存在本地的附件,你可以通过ActiveStorage的服务对象拿到真实的物理路径:
# 单个附件的磁盘路径 file_path = user.avatar.service.path_for(user.avatar.key)
这个方法会返回类似/your-app-root/storage/xy/za/your-file-name.pdf的完整路径,完全能直接传给CombinePDF.load使用。
2. 适配你的PDF合并场景
结合你用combine_pdf合并文件的需求,把之前的代码改写成这样就行:
report = CombinePDF.new # 假设这里遍历的是ActiveStorage附件对象数组,不是路径数组 your_attachments.each do |attachment| # 拿到磁盘路径后加载进合并PDF report << CombinePDF.load(attachment.service.path_for(attachment.key)) end
再啰嗦下为什么rails_blob_path不行
rails_blob_path是个路由辅助方法,它的作用是生成前端能访问的文件URL(比如/rails/active_storage/blobs/redirect/...),用来在页面上展示或者让用户下载,根本不是给后端读取本地文件用的路径,所以传给CombinePDF.load肯定会找不到文件。
小提醒
这个方法只适用于本地存储哦!如果之后你的项目换成S3、OSS这类云存储,path_for就没法返回本地路径了(因为文件不在服务器磁盘上),那时候就得先把文件下载到临时目录再处理。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

