如何实现 cloudinary 以动态显示图像作为背景?我看不到正确获取它们

Posted

技术标签:

【中文标题】如何实现 cloudinary 以动态显示图像作为背景?我看不到正确获取它们【英文标题】:How can I implement cloudinary to display images as backgrounds dynamically? I can't see to fetch them correctly 【发布时间】:2021-10-03 18:17:50 【问题描述】:

我想知道为什么我无法从 cloudinary 中获取图像,我想将图像作为背景发布,显然我没有正确获取图像。


function Post(post)

    return(
        <div className='PostBlock' 
        style=backgroundImage: `url($post.getImage)`>
          
              <div>
              console.log(post.getImage) 
            <h3>genere:post.getGenere</h3>
           
            </div>
             <div>
                 <h3>Title: post.getTitle</h3>
            </div>
            
            <div>
            <p>post.getBody</p>
        
            </div>
            
        </div>
    )


export default Post

我的 PostForm 是一个模态,这是我点击“保存帖子”后成功上传图片的地方,尽管问题依赖于获取和显示图片 url,显然我没有正确执行,向下滚动到“Post”组件代码sn-p


import  useState  from "react"
import Axios from "axios"



function PostFormModal(onAdd)
 
let [getGenere,setGenere]=useState('Travel')
const [getTitle,setTitle]=useState('')
const [getBody,setBody]=useState('')
let [getImage,setImage]=useState('')

   const uploadImage = () => 
    const formData = new FormData()
    formData.append("file",getImage)
    formData.append("upload_preset","ddyy5zbx")

    Axios.post("https://api.cloudinary.com/v1_1/dk5lv4qj5/image/upload",formData)
    .then((res)=>console.log(res))
    .catch((e)=>console.log(e))


    //const genere = ['Travel','LifeStyle','Business','Food','Work']
        
        
    const onSubmit=(e)=>
        e.preventDefault()
        onAdd(getGenere,getTitle,getBody,getImage)
    

return( 

        <div className='formStyle' >
            <form onSubmit=onSubmit >
                <div className="formStyleInner">
                    <label>Choose a genere: </label>
                    <select value=getGenere onChange=e=>setGenere(e.target.value)>
                        <option value='Travel'>Travel</option>
                        <option value='Lifestyle'>LifeStyle</option>
                        <option value='Business'>Business</option>
                        <option value='Food'>Food</option>
                        <option value='Work'>Work</option>
                    </ select>
               </div>

                <div className="formStyleInner">
                    <label>Title:</label>
                        <input type="text"
                        value=getTitle
                                placeholder='add a title!'
                                onChange=(e)=>setTitle(e.target.value)> 
                        </input>
                </div>
                
                <div className="formStyleInner">
                    <label>Background Image:</label>
                        <input type="file"
                                onChange=(e)=>setImage(e.target.files[0])> 
                               
                        </input>
                      
                </div>

                <div className="formStyleInner">
                       
                    <textarea type='textarea'
                        rows='10'
                        cols="35"
                        value=getBody
                        placeholder='add text!'
                        onChange=(e)=>setBody(e.target.value)>
                       
                    </textarea>
                </div>
                    <input type="submit" value="Save post" onClick=uploadImage/>
            </form>
        </div>
    )


export default PostFormModal

这是我的 App()

import  useState  from "react";
import PostList from "./component/PostList";
import PostModalBtn from "./component/postModalBtn";
import PostFormModal from "./component/PostFormModal";
import FilterButton from "./component/FilterButton";
//Filter MAP

const FilterMap = 
  All:() => true,
  Travel: genSel => genSel.Travel,
  LifeStyle:genSel=> genSel.LifeStyle,
  Business:genSel=> genSel.Business,
  Food:genSel=> genSel.Food,
  Work:genSel=>genSel.Work
  


const FilterNames=Object.keys(FilterMap)
   


function App(onAdd) 
const [isModalDisplayed,setIsModalDisplayed]=useState(false)
const[filter, setFilter]= useState('All')
const[posts,setPosts]=useState(
  [
    
      id:1,
      getTitle:'Titulo Generico',
      getGenere:'Travel',
      getBody:'Prueba de body'
    ,

  ]
 )
 
//FilterList

const filterList =  FilterNames.map(name=>(
  <FilterButton 
    key=name
    name=name
    isPressed=name === filter
    setFilter=setFilter/>
))

 //addPost action

 const addPost = (post)=>
   const id= Math.floor(Math.random()*1000)+1
   const getPost = id,...post
   setPosts([...posts,getPost])
 
  return (
  <>
        <div className='headerTitle'>
          <h5>Making your life easier</h5>
        </div>
        <div className='titleCont'>
          <h1>Discovering the world</h1>
        </div>
        <div className='FilterBtnStyle'>
         filterList
        </div>
          <div className='buttonCont'>
           <PostModalBtn onClick=onAdd/>
        </div>
            <PostFormModal onAdd=addPost/>
        
        <PostList posts=posts/>
 </>
  );


export default App;

“Post”组件,这是应该动态引入背景图像的地方,显然我没有正确调用它,因为它没有获取正确的路径......

function Post(post)

    return(
        <div className='PostBlock' 
        style=backgroundImage: `url($post.getImage)`>
          
              <div>
              console.log(post.getImage) 
            <h3>genere:post.getGenere</h3>
           
            </div>
             <div>
                 <h3>Title: post.getTitle</h3>
            </div>
            
            <div>
            <p>post.getBody</p>
        
            </div>
            
        </div>
    )


export default Post

从控制台查看上传,我们可以看到上传到cloudinary的对象确实有一个url供我们使用

我实际获取的是附加到“getImage”而不是“url”的对象

根据我一直在阅读的内容,除非我使用 cloudinary-react 和 cloudinary-core 库中的 IMAGE 标签,否则我无法从 cloudinary 调出图像,但我不知道如何将其实现到背景图像中

【问题讨论】:

【参考方案1】:

将图像上传到 Cloudinary 后,您可以像使用任何其他图像 URL 一样使用图像 URL 在 html 页面上显示图像。但是,如果您想使用任何 Cloudinary 辅助方法,则应使用 public_id,它是 Clouudinary 上图像的名称,在这种情况下是以 mqrhnpw.. 开头的那个(Cloudinary URL 的最后一部分在版本号)。

【讨论】:

感谢您的回复,我的问题在于动态添加它,我需要访问我不知道如何访问的 url 字符串(或 secure_url),我只知道“响应”给出返回一个具有“url”和“secure_url”的数据密钥的对象,我需要将其作为属性发送。

以上是关于如何实现 cloudinary 以动态显示图像作为背景?我看不到正确获取它们的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像上传到 cloudinary

如何将缓冲区图像上传到 cloudinary?

Cloudinary:如何在按钮单击时显示最高分辨率的图像?

如何使 Cloudinary 链接以 UTF-8 格式显示原始内容?

如何在上传后立即接收 Cloudinary 图像 URL(React JS 和 Node Js)?

Next.js 图像组件不显示 Cloudinary 图像