React FC에서 이미지 파일을 Content-type : multipart/form-data로 POST하는 방법 (axios)
『Content-type: form-data』로 송신할 기회가 있었으므로, 정리합니다.
버튼 부분은 머티리얼 UI를 사용하고 있습니다.
환경
react 16.12.0
typescript 3.7.3
material-ui/core 4.8.0(Button에 사용)
하고 싶은 것
input에서 선택한 파일을 state로 설정, 설정된 파일을 POST
전체
const IconUpload: FC = () => {
const [userIconFormData, setUserIconFormData] = useState<File>()
const handleSetImage = (e: ChangeEvent<HTMLInputElement>) => {
if (!e.target.files) return
const iconFile:File = e.target.files[0]
setUserIconFormData(iconFile)
}
const handleSubmitProfileIcon = () => {
const iconPram = new FormData()
if (!userIconFormData) return
iconPram.append('user[icon]', userIconFormData)
axios
.post(
'https://api/update',
iconPram,
{
headers: {
'content-type': 'multipart/form-data',
},
}
)
}
return (
<form>
<p>アイコンアップロード</p>
<input
type="file"
accept="image/*,.png,.jpg,.jpeg,.gif"
onChange={(e: ChangeEvent<HTMLInputElement>) => handleSetImage(e)}
/>
<Button
text="変更する"
variant="contained"
color="primary"
type="button"
onClick={handleSubmitProfileIcon}
disabled={userIconPreview === undefined}
/>
</form>
)
}
export default IconUpload
잘라서 해설
form 주위, 버튼 부분
<form>
<p>アイコンアップロード</p>
<input
type="file"
accept="image/*,.png,.jpg,.jpeg,.gif"
onChange={(e: ChangeEvent<HTMLInputElement>) => handleSetImage(e)}
/>
<Button
text="変更する"
variant="contained"
color="primary"
type="button"
onClick={handleSubmitProfileIcon}
disabled={userIconPreview === undefined}
/>
</form>
입력
버튼
파일 가져오기function
const handleSetImage = (e: ChangeEvent<HTMLInputElement>) => {
if (!e.target.files) return
const iconFile:File = e.target.files[0]
setUserIconFormData(iconFile)
}
if (!e.target.files) return
TypeScript에서는 undefind가 될 가능성이있는 값에 관해서는 에러가 나오므로 먼저 없는 경우는 return 하는 것을 명시적으로 하고 있다const iconFile:File = e.target.files[0]
이것이 파일 본체.files는 복수 선택 가능한 경우를 갖추어 배열이 되어 있어 [0]으로서 주지 않으면 취득할 수 없다.
형식은 File.
setUserIconFormData(iconFile)
state에 세트그건 그렇고, e.target.files [0]을 URL로 만들고 img에 넣고 싶다면
const blobUrl = URL.createObjectURL(iconFile)
blob:http://パス
로 변환되어 URL을 다음으로 처리할 수 있습니다.파일을 axios로 POST하는 기능
const createProfileIcon = () => {
const iconPram = new FormData()
if (!userIconFormData) return
iconPram.append('user[icon]', userIconFormData)
axios
.post(
'https://api/update',
iconPram,
{
headers: {
'content-type': 'multipart/form-data',
},
}
)
}
마침내 API 전송 부분
content-type: multipart/form-data
1. FormData 라는 형식으로 보내주어야 한다.
const iconPram = new FormData()
FormData 개체 만들기형은 그만까지
FormData
iconPram.append('user[icon]', userIconFormData)
만든 FormData 개체에 매개 변수 추가append (키, 전송할 파일)
2. headers에 'content-type': 'multipart/form-data' 지정
기본 API 통신할 때는 json이 많을까 생각합니다만, json에서는 올바르게 보내지 못하고, 비어지므로 주의
_axios.create
className.defaults.headers = { 'Content-Type': 'multipart/form-data' }
그래서 덮어 씁시다.
송신 내용
이런 느낌입니다.
확인 포인트
RequestHeaders의
content-type
가 multipart/form-data
입니다.(binary)
입니다 요약
이제 성공적으로 multipart/form-data로 파일을 POST할 수 있습니다!
WEB 서비스를 작성할 때, 이미지의 업로드는 잘 나오는 상황이라고 생각하기 때문에, 참고가 되면 다행입니다
처음으로 이 기능을 구현할 때는 헤매는 부분이 많이 있어, 파일의 POST하는 형태도 몇종인가 있다고 생각하고 있었습니다만, 2종류만 같습니다.
인코딩하면 json 그대로 보낼 수 있는 이점이 있습니다만, 파일 사이즈가 20~30% 오른다고 합니다.
하면 할수록 깊고 정답이 없어 헤매지만 즐겁습니다.
Reference
이 문제에 관하여(React FC에서 이미지 파일을 Content-type : multipart/form-data로 POST하는 방법 (axios)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/natuuu0831/items/8b392ad47133b575b620텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)