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

Rails应用为Android移动端开发图片上传API遇问题求助

解决Rails图片上传API的Errno::ENOENT错误

嘿,我一眼就看出问题所在啦!你现在的代码里用File.open(params[:portrait], 'rb')去尝试打开一个Cloudinary的远程URL,但File.open()这个方法是用来读取本地文件系统里的文件的,根本没法直接处理网络地址,这就是为什么会抛出Errno::ENOENT(找不到文件或目录)的错误。

接下来分两种常见场景给你解决方案:

场景一:Android直接把图片文件上传到Rails API

如果你的需求是让Android端把图片文件直接传给Rails,推荐用Rails自带的Active Storage来处理文件上传,步骤如下:

  1. 先在User模型里关联Active Storage:
# app/models/user.rb
class User < ApplicationRecord
  has_one_attached :portrait
end
  1. 修改你的update方法,直接接收上传的文件参数:
def update
  @user = @current_user
  if @user.update(user_params)
    render action: 'settings'
  else
    # 可选:返回错误信息给Android端
    render json: { errors: @user.errors.full_messages }, status: :unprocessable_entity
  end
end

private
def user_params
  params.permit(:portrait)
end
  1. 提醒Android端:发送请求时要使用multipart/form-data格式,把图片作为文件类型的参数(参数名对应:portrait)上传,而不是传URL。

场景二:Android已将图片上传到Cloudinary,Rails仅存储URL

如果Android端已经完成了图片上传到Cloudinary的操作,只需要把生成的URL传给Rails存储,那完全不需要用File.open(),直接存URL即可:

  1. 确保User模型有一个字符串类型的字段(比如portrait_url),用来存储Cloudinary的图片地址。

  2. 修改update方法:

def update
  @user = @current_user
  if @user.update(user_params)
    render action: 'settings'
  else
    render json: { errors: @user.errors.full_messages }, status: :unprocessable_entity
  end
end

private
def user_params
  params.permit(:portrait_url)
end

这时候Android端只需要把Cloudinary返回的图片URL作为portrait_url参数传给API即可,Rails直接存储这个字符串,后续前端显示时直接使用该URL加载图片。

额外小提示

  • 记得根据你的实际需求选择对应场景,不要混淆“传文件”和“传URL”的逻辑;
  • 如果想用Active Storage直接对接Cloudinary,也可以配置Active Storage的Cloudinary服务,这样Rails可以直接把上传的文件转存到Cloudinary,不用Android单独处理上传。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:55:29