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

Ruby技术问题:如何临时存储远程文件并提交至API

解决CarrierWave远程文件提交PhoneGap API的问题

我看你现在的情况是:用本地未通过CarrierWave上传的文件调用PhoneGap的Android密钥API完全正常,比如这段代码能顺利拿到返回的ID:

JSON.parse(RestClient.post("https://build.phonegap.com/api/v1/keys/android", { keystore: File.new(Rails.root.join('file.keystore')) }), symbolize_names: true)[:id] => 312199

但尝试把CarrierWave存在远程的文件临时下载到本地再提交时,代码还没写完卡住了对吧?我猜你是想把HTTParty获取到的响应内容写入临时文件,再用这个临时文件调用API。这里给你补全并优化这段代码,应该能解决问题:

# 获取远程文件的响应内容
response = HTTParty.get(model.file.url)
# 创建带后缀的临时文件(API会通过后缀识别文件类型,这步很关键)
temp_file = Tempfile.new(["keystore", ".keystore"], Rails.root.join('tmp'))
begin
  temp_file.binmode
  temp_file.write(response.body)
  temp_file.rewind # 写完后把文件指针移到开头,否则API读取时会视为空文件
  
  # 携带临时文件提交API,记得加上认证头
  result = JSON.parse(
    RestClient.post(
      "https://build.phonegap.com/api/v1/keys/android",
      { keystore: temp_file },
      Authorization: "Bearer YOUR_PHONEGAP_API_TOKEN" # 替换成你的实际Token
    ),
    symbolize_names: true
  )
  puts result[:id] # 输出返回的ID
ensure
  temp_file.close
  temp_file.unlink # 无论请求成功失败,都删除临时文件避免堆积
end

这里有几个必须注意的细节:

  • 给临时文件加上对应后缀(比如.keystore),很多API会依赖文件名后缀判断文件类型,无后缀可能导致识别失败
  • 写入内容后一定要调用rewind,不然文件指针停在末尾,API读取时会认为文件为空
  • 用ensure块确保临时文件被正确清理,避免服务器临时文件堆积
  • 必须在请求头里带上PhoneGap的API认证信息,否则会返回权限错误

内容的提问来源于stack exchange,提问作者heroxav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:24:46