SolidJS 및 Cloudinary를 사용한 이미지 업로드
28296 단어 suidsolidjsaxioscloudinary
useCloudinary
를 생성합니다.도서관
특징
src/hooks/useCloudinary.jsx
import axios from "axios";
import shortid from "shortid";
import { createStore } from "solid-js/store";
const url = `https://api.cloudinary.com/v1_1/${
import.meta.env.VITE_CLOUDINARY_CLOUD_NAME
}/image/upload`;
export default function useCloudinary() {
const [store, setStore] = createStore({
image: null,
imagePreview: "",
uploadProgress: 0,
alert: null,
abortToken: null,
});
function handleImageChange(e) {
const image = e.target.files[0];
// create blob url of selected image for preview
const imagePreview = URL.createObjectURL(image);
// create axios cancellation token to abort request in future
const abortToken = axios.CancelToken.source();
setStore("image", image);
setStore("imagePreview", imagePreview);
setStore("abortToken", abortToken);
setStore("alert", {
severity: "success",
text: "Image loaded successfully",
});
}
function handleImageRemove() {
// cleanup blob metadata
URL.revokeObjectURL(store.imagePreview);
window.location.reload();
}
async function handleImageUpload() {
try {
const formData = new FormData();
formData.append("file", store.image);
formData.append(
"upload_preset",
import.meta.env.VITE_CLOUDINARY_UPLOAD_PRESET
);
formData.append("api_key", import.meta.env.VITE_CLOUDINARY_API_KEY);
formData.append("public_id", shortid.generate());
const response = await axios.post(url, formData, {
onUploadProgress: handleUploadProgess,
cancelToken: store.abortToken.token,
});
setStore("alert", {
severity: "success",
text: "Image uploaded to cloudinary successfully",
});
// revoke preview blob url
URL.revokeObjectURL(store.imagePreview);
setStore("imagePreview", response.data.url);
} catch (error) {
console.log(error);
}
}
function handleUploadProgess(progressEv) {
const progress = Math.floor((progressEv.loaded / store.image.size) * 100);
console.log(progress);
setStore("uploadProgress", progress);
}
function handleCancelUpload() {
store.abortToken.cancel();
setStore("alert", {
severity: "error",
text: "Image upload aborted",
});
}
return {
store,
handleImageChange,
handleImageRemove,
handleImageUpload,
handleCancelUpload,
};
}
우리는 새로운 상점을 만들고 초기 값으로 초기화했습니다.
image
필드는 로컬에서 선택한 이미지를 저장합니다.imagePreview
필드는 이미지 미리보기를 위한 이미지 URL을 저장합니다.성공적으로 업로드된 후 cloudinary URL입니다.
uploadProgress
필드는 이미지 데이터의 백분율을 표시합니다.cloudinary에 업로드되었습니다.
alert
성공, 오류 및 경고 메시지를 표시합니다.abortToken
필드는 Axios CancelTokenSource를 저장합니다.중간에 요청을 중단하는 데 도움이 됩니다.
handleImageChange()
이미지의 blob URL을 만드는 함수우리가 사용할 수 있는 미리보기 및 axios 취소 토큰
중간에 요청을 취소하는 미래.
handleImageRemove()
메서드는 미리 보기 이미지를 제거하고 취소합니다.blob 메타데이터에서 획득한 메모리를 정리하기 위한 blob url.
handleImageUpload()
Cloudinary에 이미지 업로드 기능axios post request 사용 및 이미지가 성공적으로 실행되었을 때
업로드하면 Blob URL이 취소되고 cloudinary에서 이미지가 표시됩니다.
URL.
handleUploadProgess()
기능 추적 업로드 청크이미지 데이터.
handleCancelUpload()
함수 취소 축 요청.프로젝트 루트에
.env
파일을 생성하고 필요한 환경 변수를 추가합니다..env
VITE_CLOUDINARY_UPLOAD_PRESET=
VITE_CLOUDINARY_API_KEY=
VITE_CLOUDINARY_CLOUD_NAME=
브라우저에서 환경 변수에 액세스하려면 접두사
VITE_
가 필요합니다.SUID 라이브러리를 사용하여 UI를 생성합니다. SUID는 MUI React에서 포팅된 Solidjs용 컴포넌트 머티리얼 디자인입니다.
import { ThemeProvider } from "@suid/material";
import Alert from "@suid/material/Alert";
import Button from "@suid/material/Button";
import Card from "@suid/material/Card";
import CardActions from "@suid/material/CardActions";
import CardMedia from "@suid/material/CardMedia";
import Container from "@suid/material/Container";
import Grid from "@suid/material/Grid";
import LinearProgress from "@suid/material/LinearProgress";
import Stack from "@suid/material/Stack";
import { Show } from "solid-js";
import useCloudinary from "./hooks/useCloudinary";
function App() {
let fileInputRef = null;
const {
store,
handleImageChange,
handleImageRemove,
handleImageUpload,
handleCancelUpload,
} = useCloudinary();
return (
<ThemeProvider>
<Container>
<Grid container sx={{ justifyContent: "center" }}>
<Grid item md={6} xs={12}>
<Show when={store.alert}>
<Alert sx={{ mt: 4, mb: 4 }} severity={store.alert.severity}>
{store.alert.text}
</Alert>
</Show>
<input
type="file"
hidden
ref={fileInputRef}
accept="image/*"
onChange={handleImageChange}
/>
<Button
onClick={() => fileInputRef.click()}
variant="contained"
size="large"
>
Select Image
</Button>
<Show when={store.uploadProgress}>
<Stack direction={"column"} spacing={2}>
<LinearProgress
sx={{ mt: 4 }}
variant="determinate"
value={store.uploadProgress}
/>
<Button
variant="contained"
color="error"
onClick={handleCancelUpload}
>
Cancel Upload
</Button>
</Stack>
</Show>
<Show when={store.imagePreview}>
<Card sx={{ mt: 4 }}>
<CardMedia
component="img"
height="600px"
image={store.imagePreview}
alt="Image Preview"
/>
<CardActions>
<Button
variant="contained"
color="error"
onClick={handleImageRemove}
>
Remove
</Button>
<Button
variant="contained"
color="success"
onClick={handleImageUpload}
>
Upload
</Button>
</CardActions>
</Card>
</Show>
</Grid>
</Grid>
</Container>
</ThemeProvider>
);
}
export default App;
거친 망 갈람 / 솔리드 클라우드 이미지 업로드
solidjs 및 cloudinary를 사용한 이미지 업로드
용법
이러한 템플릿 종속성은 pnpm을 통해
pnpm up -Lri
를 통해 유지됩니다.이것이
pnpm-lock.yaml
가 표시되는 이유입니다. 즉, 모든 패키지 관리자가 작동합니다. 템플릿을 복제하면 이 파일을 안전하게 제거할 수 있습니다.$ npm install # or pnpm install or yarn install
Solid 웹사이트에서 자세히 알아보고 Discord에서 대화를 나누세요.
사용 가능한 스크립트
프로젝트 디렉토리에서 다음을 실행할 수 있습니다.
npm dev 또는 npm 시작
개발 모드에서 앱을 실행합니다.
브라우저에서 보려면 http://localhost:3000을 여십시오.
수정하면 페이지가 다시 로드됩니다.
npm 실행 빌드
프로덕션용 앱을
dist
폴더에 빌드합니다.프로덕션 모드에서 Solid를 올바르게 번들하고 최상의 성능을 위해 빌드를 최적화합니다.
빌드가 축소되고 파일 이름에 해시가 포함됩니다.
앱을 배포할 준비가 되었습니다!
전개
당신은 할 수 있습니다…
View on GitHub
Reference
이 문제에 관하여(SolidJS 및 Cloudinary를 사용한 이미지 업로드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kcdchennai/image-upload-using-solidjs-and-cloudinary-634텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)