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
相关产品推荐
相关产品推荐

