Ruby on Rails从URL获取文件求助:如何通过Amazon Ads API返回链接获取文件
Ruby从Amazon Ads API返回的URL获取文件的方法
方案1:用OpenURI快速实现(适合无特殊认证要求的URL)
OpenURI是Ruby标准库的扩展,用法简洁,适合直接可访问的URL:
require 'open-uri' # 替换为API返回的实际下载URL download_url = "https://example-amazon-ads-url.com/file.csv" # 定义本地保存路径和文件名 local_file_path = "./amazon_ads_report.csv" # 下载并写入文件 File.open(local_file_path, 'wb') do |file| file.write(URI.open(download_url).read) end
方案2:用Net::HTTP处理带认证的URL(更灵活)
如果Amazon Ads返回的URL需要携带特定请求头(比如认证令牌),Net::HTTP可以更精细地控制请求:
require 'net/http' require 'uri' download_url = URI.parse("https://example-amazon-ads-url.com/file.csv") local_file_path = "./amazon_ads_report.csv" Net::HTTP.start(download_url.host, download_url.port, use_ssl: download_url.scheme == 'https') do |http| request = Net::HTTP::Get.new(download_url) # 根据Amazon Ads API要求添加认证头,示例: # request['Authorization'] = "Bearer YOUR_ACCESS_TOKEN" # request['x-amz-access-token'] = "YOUR_AMAZON_ADS_TOKEN" response = http.request(request) if response.is_a?(Net::HTTPSuccess) File.open(local_file_path, 'wb') { |file| file.write(response.body) } puts "文件已成功保存到 #{local_file_path}" else puts "下载失败:#{response.code} #{response.message}" end end
方案3:流式下载大文件(避免内存溢出)
如果要下载的文件体积较大,建议用流式写入的方式分块处理内容:
require 'net/http' require 'uri' download_url = URI.parse("https://example-amazon-ads-url.com/large_file.csv") local_file_path = "./large_amazon_ads_report.csv" Net::HTTP.start(download_url.host, download_url.port, use_ssl: download_url.scheme == 'https') do |http| request = Net::HTTP::Get.new(download_url) # 添加必要的认证头 http.request(request) do |response| File.open(local_file_path, 'wb') do |file| # 分块读取并写入 response.read_body do |chunk| file.write(chunk) end end end end
注意事项
- 确认URL有效期:Amazon Ads返回的下载URL通常有时间限制,需在有效期内执行下载
- 异常处理:实际使用时建议添加异常捕获(比如
rescue OpenURI::HTTPError, Errno::ENOENT等),避免程序崩溃 - 认证信息:如果URL需要签名或特定令牌,务必按照Amazon Ads API文档要求添加请求头
内容的提问来源于stack exchange,提问作者Diwanshu Tyagi
相关产品推荐
相关产品推荐

