image는 file이기 때문에, input 태그를 사용하여 업로드할 수 있다.
단일 이미지
input type='file'
- accept는 업로드 할 수 있는 파일 확장자이다.
<div>
<input type='file'
accept='image/jpg,impge/png,image/jpeg,image/gif'
name='profile_img'
onChange={onChange}>
</input>
</div>
다음과 같이 파일을 입력받아 FormData 객체에 집어넣어 파일을 손쉽게 전송할 수 있다.
FormData
: formData 는 내가 지정한 key값과 파일을 value로 삼아 데이터 및 파일 전송을 손쉽게 해주는 객체이다.
const onChange = (e) => {
const img = e.target.files[0];
const formData = new FormData();
formData.append('file', img);
}
다중 이미지
input[type="file" multiple]
: 미리보기 기능은 위의 결과값에서 없는 상대경로를 알아내야하기 때문에 까다롭다.
- URL.createObjectUrl() 메소드를 사용
<input
type="file"
multiple
accept="image/jpg,image/png,image/jpeg,image/gif"
onChange={handleImageUpload}
/>
- input[type="file"]의 디자인을 바꾸기 위해서 label 태그를 사용한다.
- label 태그에 onChange 이벤트를 등록한다.
- onChange의 event객체를 이용해서 이미지 데이터들을 받아온다.
- 받아온 이미지들을 순회하면서 URL.createObjectUrl()의 매개변수로 이미지를 넣고 상대경로를 반환 받는다.
- 반환 받은 상대경로를 배열로 관리하고 useState를 통해 데이터를 관리한다.
- 상대경로를 가지고 있는 배열을 순회하면서 img태그의 src 속성에 값을 할당하고 렌더링 시킨다.
const Images = () => {
const [showImages, setShowImages] = useState([]);
// 이미지 상대경로 저장
const handleAddImages = (event) => {
const imageLists = event.target.files;
let imageUrlLists = [...showImages];
for (let i = 0; i < imageLists.length; i++) {
const currentImageUrl = URL.createObjectURL(imageLists[i]);
imageUrlLists.push(currentImageUrl);
}
if (imageUrlLists.length > 10) {
imageUrlLists = imageUrlLists.slice(0, 10);
}
setShowImages(imageUrlLists);
};
// X버튼 클릭 시 이미지 삭제
const handleDeleteImage = (id) => {
setShowImages(showImages.filter((_, index) => index !== id));
};
return (
<div className={classes.addPicture}>
<label htmlFor="input-file" className={classes.addButton} onChange={handleAddImages}>
<input type="file" id="input-file" multiple className={classes.addButton} />
<Plus fill="#646F7C" />
<span>사진추가</span>
</label>
// 저장해둔 이미지들을 순회하면서 화면에 이미지 출력
{showImages.map((image, id) => (
<div className={classes.imageContainer} key={id}>
<img src={image} alt={`${image}-${id}`} />
<Delete onClick={() => handleDeleteImage(id)} />
</div>
))}
</div>
);
};
출처
https://velog.io/@min1378/React-image-%EC%97%85%EB%A1%9C%EB%93%9C
React image 업로드
업무 진행 중, React에서 image를 업로드 해야 할 일이 생겨 정리해보았다. input type='file' image는 file이기 때문에, input 태그를 사용하여 업로드 할 수 있다. accept 는 업로드 할 수 있는 파일 확장자이
velog.io
[React] input태그로 사진 파일 여러개 업로드하기 + 브라우저에서 미리보기 가능하게 만들기
문제점 react에서 type=file인 input 태그에 사진을 넣고 그 결과물을 console창에 찍어보면 아래와 같이 여러 정보가 나오는데 정작 미리보기할 때 띠울 로컬상대경로는 안보임! react에서 자동적으로
hyunsix.tistory.com
이미지 다중 업로드 및 미리보기
리액트에서 어떻게 이미지를 여러장 업로드 시키고 미리보기를 어떻게 구현하는지 설명하려고 한다. 우선 input[type="file" multiple]을 통해 이미지를 업로드하면 다음과 같은 결과를 얻을 수 있다.
velog.io
'Development > React.js' 카테고리의 다른 글
리엑트에서 moment.js 사용하기 (0) | 2022.05.14 |
---|---|
redux 에서 비동기 처리 어떻게 해야할까? (0) | 2022.05.14 |
리엑트에서 이미지 경로 설정하기 (0) | 2022.05.13 |
request 여러번 요청하기 (0) | 2022.05.13 |
Navigate로 리다이렉트 하기 (0) | 2022.05.12 |