如何用Ruby代码直接从Blob URL下载PDF文件?
用Ruby直接获取Blob URL对应的PDF文件
Blob URL的本质限制
- Blob URL(如
blob:https://dev.myapp.com/ba853441-d1f7-4595-9227-1b0e445b188b)是浏览器为当前会话生成的本地内存引用,仅在创建它的浏览器实例中有效 - 外部HTTP客户端(比如OpenURI、Net::HTTP)无法直接请求这类URL,因为它不指向服务器上的资源,而是浏览器内存中的临时数据
可行解决方案:Ruby结合浏览器自动化
因为不能依赖本地磁盘操作,我们可以用Ruby调用浏览器自动化工具(如Selenium),在同一个浏览器会话中获取Blob内容,直接在内存中处理。
步骤1:安装依赖
gem install selenium-webdriver
同时确保环境中安装了对应浏览器的驱动(如ChromeDriver,可通过包管理器或官方渠道安装)
步骤2:代码实现
require 'selenium-webdriver' require 'base64' # 配置Chrome浏览器,可选无头模式(后台运行) chrome_options = Selenium::WebDriver::Chrome::Options.new chrome_options.add_argument('--headless=new') # 初始化浏览器会话 driver = Selenium::WebDriver.for :chrome, options: chrome_options begin # 先访问生成Blob URL的原始页面(必须在同一会话中,Blob才有效) driver.get('https://dev.myapp.com/生成Blob的页面地址') # 替换为实际页面URL # 替换为你要处理的Blob URL target_blob_url = 'blob:https://dev.myapp.com/ba853441-d1f7-4595-9227-1b0e445b188b' # 执行JavaScript获取Blob的二进制数据(转成Base64传给Ruby) base64_pdf_content = driver.execute_script(<<~JS_SCRIPT) async function fetchBlobAsBase64(blobUrl) { const response = await fetch(blobUrl); const blob = await response.blob(); return new Promise((resolve) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result.split(',')[1]); reader.readAsDataURL(blob); }); } return fetchBlobAsBase64('#{target_blob_url}'); JS_SCRIPT # 将Base64转换为二进制PDF数据 pdf_binary_data = Base64.decode64(base64_pdf_content) # 这里可以直接对pdf_binary_data进行内存级处理,比如: # - 传给其他API接口 # - 用Ruby的PDF库(如Prawn、PDF::Reader)解析内容 # - 写入内存流而非本地文件 puts "成功获取到PDF二进制数据,大小:#{pdf_binary_data.size} 字节" ensure # 关闭浏览器会话 driver.quit end
关键说明
- 必须在生成Blob URL的同一个浏览器会话中访问它,否则Blob URL会失效
- 所有操作都在内存中完成,不需要下载到本地磁盘,符合项目要求
- 无头模式适合在服务器或无界面环境中运行,若需要可视化调试可去掉
--headless=new参数
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

