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

React Native通过Attachinary及Rails API传图至Cloudinary报错解决

解决Errno::ENOENT上传Cloudinary的问题

这个错误的核心原因很明确:你的Rails服务器无法访问模拟器/设备本地的file://路径,而且前端发送的是图片的本地URL,不是实际的文件数据。下面分前端和后端两步解决:

第一步:修正React Native(Expo)前端的文件上传逻辑

你不能直接把ImagePicker返回的file://路径发给Rails API,必须把图片转换成FormData格式的文件流发送。用Expo的话,可以这么写:

import * as ImagePicker from 'expo-image-picker';
import { Platform } from 'react-native';

// 选择图片后处理上传
const pickImageAndUpload = async () => {
  let result = await ImagePicker.launchImageLibraryAsync({
    mediaTypes: ImagePicker.MediaTypeOptions.Images,
    allowsEditing: true,
    quality: 1,
  });

  if (!result.canceled) {
    const formData = new FormData();
    // 处理iOS和Android的uri差异
    const uri = Platform.OS === 'ios' ? result.assets[0].uri.replace('file://', '') : result.assets[0].uri;
    formData.append('image', {
      uri: uri,
      name: 'uploaded_image.jpg',
      type: 'image/jpeg', // 根据实际图片类型调整
    });

    // 发送请求到Rails API
    fetch('https://your-rails-api-url.com/upload', {
      method: 'POST',
      body: formData,
      headers: {
        // 注意:不要手动设置Content-Type为multipart/form-data,fetch会自动处理边界符
        'Accept': 'application/json',
        // 如果需要认证的话加token
        // 'Authorization': `Bearer ${yourAuthToken}`
      },
    })
    .then(response => response.json())
    .then(data => console.log('Upload success:', data))
    .catch(error => console.error('Upload error:', error));
  }
};

第二步:修正Rails API的处理逻辑

确保你的控制器正确接收文件,并且传给Cloudinary的是上传的文件对象,不是URL:

  1. 首先在控制器里配置强参数,允许image字段:
class UploadsController < ApplicationController
  def create
    # 先确认params[:image]是ActionDispatch::Http::UploadedFile对象
    puts params[:image].inspect # 调试用,看输出的类型

    upload_result = Cloudinary::Uploader.upload(params[:image])
    render json: { success: true, cloudinary_url: upload_result['secure_url'] }
  end

  private

  def upload_params
    params.permit(:image) # 如果用了嵌套参数就改成params.require(:upload).permit(:image)
  end
end
  1. 检查Cloudinary的配置是否正确:确保config/initializers/cloudinary.rb里已经设置了你的账号信息:
Cloudinary.config do |config|
  config.cloud_name = 'your-cloud-name'
  config.api_key = 'your-api-key'
  config.api_secret = 'your-api-secret'
  config.secure = true
end

关键调试点

  • 如果Rails控制台打印params[:image]是字符串(比如那个file://路径),说明前端的FormData构造有问题,检查前端代码里的formData.append是否正确。
  • 如果前端发送的是FormData,但Rails还是拿不到文件,确认请求的Content-Type是multipart/form-data(可以用抓包工具验证)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:05:11