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

客户端调用Cloudinary遇CORS策略错误,寻求解决方案

Fixing CORS Error & Cloudinary Image Upload Issues

Hey there, let's break down what's causing your CORS error and get your image upload working smoothly with Cloudinary!

1. The First Fix: Correct Your Cloudinary API URL

You've got a small but critical typo in your upload endpoint. Cloudinary's standard upload URL format is:

https://api.cloudinary.com/v1_1/[your-cloud-name]/image/upload

Your current URL has an extra add/ segment (...dd5gloppf/add/image/upload) — that's invalid and will throw errors before we even get to CORS. Update it to:

const url = 'https://api.cloudinary.com/v1_1/dd5gloppf/image/upload'

2. Remove the Invalid Client-Side CORS Header

You're adding an Access-Control-Allow-Origin header to your axios request, but this is a header that Cloudinary's server should send back to your client, not the other way around. Including it in your client request does nothing to solve CORS and can cause unnecessary issues. Remove that header from your axios config:

// Before (wrong)
const res = await axios.post(url, formData, {
  'Access-Control-Allow-Origin': '*'
})

// After (correct)
const res = await axios.post(url, formData)

3. Configure CORS in Your Cloudinary Dashboard

Even with the correct URL, you need to make sure Cloudinary allows requests from your local development origin (http://localhost:3000). Here's how to set that up:

  • Log into your Cloudinary account and go to the Settings page
  • Navigate to the Security tab
  • Find the CORS Configuration section
  • Add a new rule for your local origin:
    • Allowed Origins: http://localhost:3000
    • Allowed Methods: Check POST (since we're uploading files)
    • Allowed Headers: Leave as * or specify relevant headers like Content-Type
    • Save the changes

4. Updated Working Code

Here's your code with the fixes applied, plus a check to make sure an image is selected before uploading:

import React, { useState } from 'react'
import axios from 'axios'

function App() {
  const [image, setImage] = useState(null)
  const [loading, setLoading] = useState(false)
  // Corrected Cloudinary URL
  const url = 'https://api.cloudinary.com/v1_1/dd5gloppf/image/upload'
  const preset = 'ml_default'

  const onChange = e => {
    setImage(e.target.files[0])
  }

  const onSubmit = async () => {
    if (!image) {
      console.log('Please select an image first!')
      return
    }

    console.log('Uploading...')
    const formData = new FormData()
    formData.append('file', image)
    formData.append('upload_preset', preset)

    try {
      setLoading(true)
      const res = await axios.post(url, formData)
      const imageUrl = res.data.secure_url
      console.log('Upload successful! Image URL:', imageUrl)

      // Now send this URL to your backend server
      await axios.post('https://your-backend-url.com/save-image', {
        imageUrl: imageUrl
      })
      console.log('Image URL sent to backend successfully!')
    } catch (err) {
      console.error('Upload failed:', err)
    } finally {
      setLoading(false)
    }
  }

  return (
    <>
      <div className='file-field input-field'>
        <div className='btn'>
          <span>Browse</span>
          <input type='file' name='image' onChange={onChange} />
        </div>
        <div className='file-path-wrapper'>
          <input className='file-path validate' type='text' />
        </div>
        <button 
          onClick={onSubmit} 
          className='btn center'
          disabled={loading || !image}
        >
          {loading ? 'Uploading...' : 'Upload'}
        </button>
      </div>
    </>
  )
}

export default App

5. Bonus: Security Note

For production, avoid using unsigned upload presets (like ml_default) directly in client-side code. Instead, generate a signed upload URL or token from your backend server to prevent unauthorized uploads to your Cloudinary account.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:37:34