๐ ๋ฌธ์
์ด๋ฏธ์ง ํ์ผ์ ์ ํํ๊ณ , ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํด์ฃผ๋ ํ์ด์ง๋ฅผ ๊ตฌํํ๊ณ ์ถ์๋ค.
inputBox ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์ด๋ฏธ์ง ํ์ผ์ ์ ํํ๋ ๊ฒ ๊น์ง๋ ์ฑ๊ณตํ์ง๋ง,
๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก ํ์ด์ง๊ฐ ๋จ์ง ์์๋ค.
๐ ์๋ํ ๋ฐฉ๋ฒ
import React, { useState } from 'react';
import Layout from '../components/common/Layout';
import { styled } from 'styled-components';
import Text from '../components/common/Text';
import Button from '../components/common/Button';
import InputBox from '../components/common/InputBox';
import useInput from '../hooks/useInput';
import { useMutation } from 'react-query';
import { uploadPost } from '../api/posts';
function Upload() {
// ํ
์คํธ ๊ด๋ฆฌ
const [title, titleHandler] = useInput();
const [price, priceHandler] = useInput();
const [content, contentHandler] = useInput();
const [location, locationHandler] = useInput();
// ํ์ผ ๊ด๋ฆฌ
const [photo, setPhoto] = useState(null);
//์ด๋ฏธ์ง ํ์ผ ๊ด๋ฆฌ
const [previewUrl, setPreviewUrl] = useState(null);
const photoChange = (e) => {
const file = e.target.files;
setPhoto(file);
setPreviewUrl(URL.createObjectURL(file));
}
const uploadMutation = useMutation(uploadPost, {
onSuccess: () => {
alert('์
๋ก๋์ ์ฑ๊ณตํ์
จ์ต๋๋ค.')
}
})
const handleSubmit = (e) => {
e.preventDefault();
const formData = new FormData();
formData.append('photo', photo);
formData.append('title', title);
formData.append('price', price);
formData.append('content', content);
formData.append('location', location);
uploadMutation.mutate(formData);
}
return (
<Layout>
<PostTitle>์ค๊ณ ๋ฌผํ ์ฌ๋ฆฌ๊ธฐ</PostTitle>
<Container>
<CardPhoto>
{previewUrl && <img src={previewUrl} alt="Preview" style={{ maxWidth: '100%', maxHeight: '100%' }} />}
<InputBox type={'file'} onChange={photoChange} accept={'image/*'} />
<label></label>
</CardPhoto>
<form onSubmit={handleSubmit}>
<UploadTitle>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๊ธ ์ ๋ชฉ
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={title}
onChange={titleHandler} />
</UploadTitle>
<UploadPrice>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๊ฐ๊ฒฉ
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={price}
onChange={priceHandler} />
</UploadPrice>
<UploadContent>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๋ฌผํ ์ค๋ช
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={content}
onChange={contentHandler} />
</UploadContent>
<UploadLocation>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๊ฑฐ์ฃผ์ง
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={location}
onChange={locationHandler} />
</UploadLocation>
<div style={{ width: '40%', margin: 'auto' }}>
<Button width={'100%'} height={'45px'} bc={'#9e7979'} onClick={handleSubmit}>
<Text fontSize={'22px'} fontWeight={'bold'} color={'#ffffff'}>
๊ฒ์๋ฌผ ์ฌ๋ฆฌ๊ธฐ
</Text>
</Button>
</div>
</form>
</Container>
</Layout>
);
}
previewUrl์ด๋ผ๋ ์๋ก์ด ์ํ๋ฅผ ์ถ๊ฐํ๋ค.
photoChange ํจ์์์ ์ด๋ฏธ์ง๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค URL.createObjectURL(file)์ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ URL์ ์์ฑํ๊ณ , previewUrl ์ํ์ ์ค์ ํ๋ค. ๊ทธ ๋ค์, previewUrl์ด ์กด์ฌํ ๋์๋ง <img> ์์๊ฐ ๋ ๋๋ง๋๋๋ก ์ค์ ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ค.
๊ทธ๋ฌ๋, ์ค๋ฅ๋ฐ์ .. !!
๐ ์์ธ
createObjectURL ํจ์๋ ๋ธ๋ผ์ฐ์ ์ ํ์ผ ๊ฐ์ฒด๋ฅผ URL๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ต์ ๋ฒ์ ์ Chrome ๋ฐ Firefox์์๋ ์ด ํจ์์ ์ฌ์ฉ์ด ์ ํ๋์๋ค...??
๋์ ์, ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ํด ํ์ผ์ ์ ๋ก๋ํ ํ์๋ FileReader ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ฝ๊ณ , ๋ฐ์ดํฐ URL์ ์์ฑํ ์ ์๋ค.
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ
import React, { useState } from 'react';
import Layout from '../components/common/Layout';
import { styled } from 'styled-components';
import Text from '../components/common/Text';
import Button from '../components/common/Button';
import InputBox from '../components/common/InputBox';
import useInput from '../hooks/useInput';
import { useMutation } from 'react-query';
import { uploadPost } from '../api/posts';
function Upload() {
// ํ
์คํธ ๊ด๋ฆฌ
const [title, titleHandler] = useInput();
const [price, priceHandler] = useInput();
const [content, contentHandler] = useInput();
const [location, locationHandler] = useInput();
// ํ์ผ ๊ด๋ฆฌ
const [photo, setPhoto] = useState(null);
//์ด๋ฏธ์ง ํ์ผ ๊ด๋ฆฌ
const [previewUrl, setPreviewUrl] = useState(null);
const photoChange = (e) => {
const file = e.target.files[0];
setPhoto(file);
const reader = new FileReader();
reader.onload=() => {
setPreviewUrl(reader.result);
};
reader.readAsDataURL(file);
};
const uploadMutation = useMutation(uploadPost, {
onSuccess: () => {
alert('์
๋ก๋์ ์ฑ๊ณตํ์
จ์ต๋๋ค.')
}
})
const handleSubmit = (e) => {
e.preventDefault();
const formData = new FormData();
formData.append('photo', photo);
formData.append('title', title);
formData.append('price', price);
formData.append('content', content);
formData.append('location', location);
uploadMutation.mutate(formData);
}
return (
<Layout>
<PostTitle>์ค๊ณ ๋ฌผํ ์ฌ๋ฆฌ๊ธฐ</PostTitle>
<Container>
<CardPhoto>
{previewUrl && <img src={previewUrl} alt="Preview" style={{ maxWidth: '100%', maxHeight: '100%' }} />}
<InputBox type={'file'} onChange={photoChange} accept={'image/*'} />
</CardPhoto>
<form onSubmit={handleSubmit}>
<UploadTitle>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๊ธ ์ ๋ชฉ
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={title}
onChange={titleHandler} />
</UploadTitle>
<UploadPrice>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๊ฐ๊ฒฉ
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={price}
onChange={priceHandler} />
</UploadPrice>
<UploadContent>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๋ฌผํ ์ค๋ช
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={content}
onChange={contentHandler} />
</UploadContent>
<UploadLocation>
<Text fontSize={'25px'} fontWeight={'bold'} color={'#9e7979'}>
๊ฑฐ์ฃผ์ง
</Text>
<InputBox width={'270px'} height={'28px'} shadow={'1px 1px 3px 1px #9e7979'}
value={location}
onChange={locationHandler} />
</UploadLocation>
<div style={{ width: '40%', margin: 'auto' }}>
<Button width={'100%'} height={'45px'} bc={'#9e7979'} onClick={handleSubmit}>
<Text fontSize={'22px'} fontWeight={'bold'} color={'#ffffff'}>
๊ฒ์๋ฌผ ์ฌ๋ฆฌ๊ธฐ
</Text>
</Button>
</div>
</form>
</Container>
</Layout>
);
}
export default Upload;
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์นํ์ด์ง ๋๋๋ง ใป Restful API (0) | 2023.07.19 |
---|---|
ํ๋ก์ ํธ ํ๊ณ ๋ก (0) | 2023.07.06 |
JSON (0) | 2023.05.02 |
React_action creators, action values (0) | 2023.05.02 |
React_useDispatch, useSelector (0) | 2023.04.29 |