일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SSR
- app router
- tailwind
- 이분 검색
- 리터럴 타입
- React
- TS
- 투포인터
- recoil
- 반공변성
- 결정 알고리즘
- 인터섹션
- 호이스팅
- ESlint
- useAppDispatch
- RTK Query
- 무한 스크롤
- Cypress
- webpack
- map
- autosize
- 태그된 유니온
- Promise
- Jest
- async/await
- dfs
- CI/CD
- 타입 좁히기
- 공변성
- CORS
Archives
- Today
- Total
짧은코딩
이미지 업로드 하기 본문
반응형
이미지 업로드
<Container onDrop={onDrop} onDragOver={onDragOver}>
onDragOver 하는 동안 사진을 끌고 다닌다. onDrop는 사진을 놓는다. 따라서 onDragOver는 계속 호출이된다.
{dragOver && <DragOver>업로드!</DragOver>}
-onDragOver
const onDragOver = useCallback((e: any) => {
e.preventDefault();
console.log(e);
setDragOver(true);
}, []);
이렇게 해서 '업로드!'를 화면에 띄워준다.
-OnDrop
const onDrop = useCallback(
(e: any) => {
e.preventDefault();
console.log(e);
const formData = new FormData();
//dataTransfer 안에 이미지의 정보가 있다. 브라우저마다 items 혹은 files에 들어있다.
if (e.dataTransfer.items) {
// Use DataTransferItemList interface to access the file(s)
for (let i = 0; i < e.dataTransfer.items.length; i++) {
// If dropped items aren't files, reject them
if (e.dataTransfer.items[i].kind === 'file') {
const file = e.dataTransfer.items[i].getAsFile();
console.log('... file[' + i + '].name = ' + file.name);
formData.append('image', file);
}
}
} else {
// Use DataTransfer interface to access the file(s)
for (let i = 0; i < e.dataTransfer.files.length; i++) {
console.log('... file[' + i + '].name = ' + e.dataTransfer.files[i].name);
formData.append('image', e.dataTransfer.files[i]);
}
}
axios.post(`/api/workspaces/${workspace}/dms/${id}/images`, formData).then(() => {
setDragOver(false);
localStorage.setItem(`${workspace}-${id}`, new Date().getTime().toString());
mutateChat();
});
},
[workspace, id, mutateChat],
);
OnDrop는 https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop
이 사이트에서 가져온 것이다.
브라우저 마다 이미지의 정보가 items 아니면 files에 들어있다. 보통 서버로 파일을 보낼 때는 formData를 사용한다. formdata에 대한 내용은 https://www.zerocho.com/category/HTML&DOM/post/59465380f2c7fb0018a1a263
제로초님의 블로그를 참고하면 될 것 같다.
https://github.com/ZeroCho/sleact/blob/master/front/components/Chat/index.tsx
마지막으로 이 코드도 다시 체크해야 한다.
반응형
'인프런, 유데미 > Slack 클론 코딩' 카테고리의 다른 글
SWR Devtools(디버깅 유용) (0) | 2022.08.01 |
---|---|
안 읽은 메시지 수 구하기 (0) | 2022.08.01 |
가상 스크롤 바, 날짜 라이브러리(DAY.JS), 해시 태그, emotion.js에서 css에 변수 활용, 정규 표현식 (0) | 2022.07.30 |
WebSocket (0) | 2022.07.29 |
여태까지 배운 내용 정리 (0) | 2022.07.28 |
Comments