Firebase 9 自定义缩略图路径文档上传和缩略图加载头像
Firebase 9 custom thumbnail path doc upload and thumbnail load for avatar
我正在尝试重写 4 行 firebase v8 代码以与 v9 一起使用....但即使在研究了 Firebase 文档之后我仍然停留在这 3 行....此代码可在表单提交中找到函数并取自 Shaun Pelling(网络忍者)Udemy Firebase/React 课程之一。
代码的用途非常简单:
我想将评论上传到 firebase 中的自定义文件路径,其中包含先前在文件路径中定义为变量的 userId (uid)。然后上传文件。在我的 nabber 中,我还显示了由第 3 行代码创建的 url 中的图像。
编辑: 首先,这是文件最初上传到的 JSX:
<label>
<span>Upload Profile Thumbnail:</span>
<input
required
type="file"
id="thumbnail"
name="thumbnail"
/>
</label>
我指的原始 4 行 (v8):
const res = await projectAuth.createUserWithEmailAndPassword(email, password)
const uploadPath = `thumbnails/${res.user.uid}/${thumbnail.name}`
const image = await projectStorage.ref(uploadPath).put(thumbnail)
const imageUrl = await image.ref.getDownloadURL()
await res.user.updateProfile({ photoURL: imageUrl })
这就是我所拥有的。 (一团糟我不认为它甚至没有多大意义。我有点迷路,所以如果它也让你感到困惑,请无视......我只是想表明我正在尝试\(˚ ☐˚")/)
import { ref, getDownloadURL, uploadBytesResumable } from 'firebase/storage'
import { updateProfile } from 'firebase/auth'
const uploadPath = `thumbnails/${res.user.uid}/${thumbnail.name}`
const imageUrl = getDownloadURL(ref(storage, image))
const uploadTask = uploadBytesResumable(storageRef, file, metadata )
updateProfile(user, { photoURL: imageUrl})
旁注:
哦,一个可能不太重要的旁注(而且很可能是不必要的),在 v8 示例中,缩略图是在注册表单中上传的,因此在代码的第一位中有注册功能。在第二个示例 v9 中,我创建了一个全新的页面(仅供登录用户使用),以便他们稍后可以上传缩略图。为此,我从 currentlysignedin 用户那里获取“用户”对象,以便能够使用 updateProfile 函数。即:
// within the v9 code example
const { user } = useAuthContext()
//=======================================
// in the useAuthContext File:
import { AuthContext } from "../CONTEXT/AuthContext.js"
import { useContext } from "react"
export const useAuthContext = () => {
const context = useContext(AuthContext)
return context
}
//=======================================
// in the authContext File:
import { createContext, useReducer, useEffect } from 'react'
import { onAuthStateChanged } from 'firebase/auth'
import { auth } from '../Firebase/config'
export const AuthContext = createContext()
export const authReducer = (state, action) => {
switch (action.type) {
case 'LOGIN':
return { ...state, user: action.payload }
case 'LOGOUT':
return { ...state, user: null }
case 'AUTH_IS_READY':
return { user: action.payload, authIsReady: true }
default:
return state
}
}
export const AuthContextProvider = ({ children }) => {
const [state, dispatch] = useReducer(authReducer, {
user: null,
authIsReady: false
})
useEffect(() => {
const unsub = onAuthStateChanged(auth, user => {
dispatch({ type: 'AUTH_IS_READY', payload: user })
unsub()
})
}, [])
// console.log('AuthContext state:', state)
return (
<AuthContext.Provider value={{ ...state, dispatch }}>
{ children }
</AuthContext.Provider>
)
}
在 V9 代码片段中,您试图在上传图像之前下载 URL。另外,如果您不需要跟踪更新进度,请改用 uploadBytes()
:
import { ref, getDownloadURL, uploadBytesResumable } from 'firebase/storage'
import { updateProfile } from 'firebase/auth'
// pass the path in ref to create a StorageReference
const storageRef = ref(storage, `thumbnails/${res.user.uid}/${thumbnail.name}`)
// upload image, file is a blob here
await uploadBytes(storageRef, file);
const downloadUrl = await getDownloadURL(storageRef);
// this function returns promise too, add await
await updateProfile(user, { photoURL: downloadUrl })
我正在尝试重写 4 行 firebase v8 代码以与 v9 一起使用....但即使在研究了 Firebase 文档之后我仍然停留在这 3 行....此代码可在表单提交中找到函数并取自 Shaun Pelling(网络忍者)Udemy Firebase/React 课程之一。
代码的用途非常简单:
我想将评论上传到 firebase 中的自定义文件路径,其中包含先前在文件路径中定义为变量的 userId (uid)。然后上传文件。在我的 nabber 中,我还显示了由第 3 行代码创建的 url 中的图像。
编辑: 首先,这是文件最初上传到的 JSX:
<label>
<span>Upload Profile Thumbnail:</span>
<input
required
type="file"
id="thumbnail"
name="thumbnail"
/>
</label>
我指的原始 4 行 (v8):
const res = await projectAuth.createUserWithEmailAndPassword(email, password)
const uploadPath = `thumbnails/${res.user.uid}/${thumbnail.name}`
const image = await projectStorage.ref(uploadPath).put(thumbnail)
const imageUrl = await image.ref.getDownloadURL()
await res.user.updateProfile({ photoURL: imageUrl })
这就是我所拥有的。 (一团糟我不认为它甚至没有多大意义。我有点迷路,所以如果它也让你感到困惑,请无视......我只是想表明我正在尝试\(˚ ☐˚")/)
import { ref, getDownloadURL, uploadBytesResumable } from 'firebase/storage'
import { updateProfile } from 'firebase/auth'
const uploadPath = `thumbnails/${res.user.uid}/${thumbnail.name}`
const imageUrl = getDownloadURL(ref(storage, image))
const uploadTask = uploadBytesResumable(storageRef, file, metadata )
updateProfile(user, { photoURL: imageUrl})
旁注: 哦,一个可能不太重要的旁注(而且很可能是不必要的),在 v8 示例中,缩略图是在注册表单中上传的,因此在代码的第一位中有注册功能。在第二个示例 v9 中,我创建了一个全新的页面(仅供登录用户使用),以便他们稍后可以上传缩略图。为此,我从 currentlysignedin 用户那里获取“用户”对象,以便能够使用 updateProfile 函数。即:
// within the v9 code example
const { user } = useAuthContext()
//=======================================
// in the useAuthContext File:
import { AuthContext } from "../CONTEXT/AuthContext.js"
import { useContext } from "react"
export const useAuthContext = () => {
const context = useContext(AuthContext)
return context
}
//=======================================
// in the authContext File:
import { createContext, useReducer, useEffect } from 'react'
import { onAuthStateChanged } from 'firebase/auth'
import { auth } from '../Firebase/config'
export const AuthContext = createContext()
export const authReducer = (state, action) => {
switch (action.type) {
case 'LOGIN':
return { ...state, user: action.payload }
case 'LOGOUT':
return { ...state, user: null }
case 'AUTH_IS_READY':
return { user: action.payload, authIsReady: true }
default:
return state
}
}
export const AuthContextProvider = ({ children }) => {
const [state, dispatch] = useReducer(authReducer, {
user: null,
authIsReady: false
})
useEffect(() => {
const unsub = onAuthStateChanged(auth, user => {
dispatch({ type: 'AUTH_IS_READY', payload: user })
unsub()
})
}, [])
// console.log('AuthContext state:', state)
return (
<AuthContext.Provider value={{ ...state, dispatch }}>
{ children }
</AuthContext.Provider>
)
}
在 V9 代码片段中,您试图在上传图像之前下载 URL。另外,如果您不需要跟踪更新进度,请改用 uploadBytes()
:
import { ref, getDownloadURL, uploadBytesResumable } from 'firebase/storage'
import { updateProfile } from 'firebase/auth'
// pass the path in ref to create a StorageReference
const storageRef = ref(storage, `thumbnails/${res.user.uid}/${thumbnail.name}`)
// upload image, file is a blob here
await uploadBytes(storageRef, file);
const downloadUrl = await getDownloadURL(storageRef);
// this function returns promise too, add await
await updateProfile(user, { photoURL: downloadUrl })