๋น๊ต์ ์์กฐ๋กญ...๊ฒ ํ๋ก์ ํธ ์ฝ๋ฉ์ ํ๊ณ ์์๋๋ฐ ํ์์ผ์ ๋ง์น ์๋งํ์ง ๋ง๋ผ๋๋ฏ์ด Axios network error๊ฐ ๋ํ๋ฌ๋ค. ์ด๋ฏธ์ง ์ ๋ก๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋์๋ค. ์ฐ๋ฆฌ ๋ก์ง์ ํ๋ก ํธ ์ชฝ์์ ํ์ผ๋ช ์ ์๋ฒ์ ๋ณด๋ด์ฃผ๋ฉด, ์๋ฒ๊ฐ S3์ pre-signed url์ ์์ฒญํ๊ณ , ๊ฑฐ๊ธฐ์ ๋ฐ์์จ pre-signed url์ ๋ค์ ํ๋ก ํธ์ ๋ฐํํด์ฃผ์ด์ ํ๋ก ํธ๊ฐ ๊ทธ url์ ๋ฐ๋ก ์ด๋ฏธ์ง put ์์ฒญ์ ๋ณด๋ด๋ ๋ก์ง์ด๋ค. ๊ทธ๋ฐ๋ฐ pre-signed url์ ๋ฐ์์ค๋ ๊ฒ๊น์ง๋ ์ํ๋๋ฐ ํ๋ก ํธ ์ชฝ์์ ๊ทธ url์ put ์์ฒญ์ ๋ณด๋ด๋ ค๊ณ ํ๋๊น ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ญ์๊ฐ์ง ์ ๋ ๋ฐฉ๋ฒ์ ์๋ํด ๋ดค๋๋ฐ ํด๊ฒฐ์ด ์ ๋์ด์ ๋ธ๋ก๊ทธ์ ์ค๋ฅ ํด๊ฒฐ ์ฝ์ง๊ธฐ๋ผ๋ ์ ๋ฆฌํด ๋ณด๋ ค๊ณ ํ๋ค:) ์ฝ๊ฒ๋ง ์ด์๊ฐ๋ฉด ์ฌ๋ฏธ์์ด ๋น๊ณ ใ
axios.put(res.data.preSignedUrl, photo)
.then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
๋งจ ์ฒ์์ ์์ฑํ๋ ์ฝ๋๋ ์ด๊ฑฐ์๋ค. ๋ ํผ ์ฌ๋ฌ ๊ฐ ์ฐพ์๋ดค๋๋ฐ ๋ค๋ค ์ฝ๋๊ฐ ๋น์ท๋น์ทํ๊ณ ์ด๋ ค์ธ ๊ฑฐ ์๋ ์ฝ๋๋ผ ์ด๋ ๊ฒ ์์ฑํ๋๋ฐ ์ค๋ฅ๊ฐ ๋ ์ค์...
pre-signed url์ ์ฝ์์ ์ฐ์ด ๋ณด๋ฉด ์ด๋ฐ ์์ผ๋ก ์ ๋ฌ๋ค.
photo
ํ์ผ ๋ณ์๋ ์ฝ์์ ์ฐ์ด๋ณด๋ฉด ์ด๋ฐ ์์ผ๋ก... ์ ๋ฌ๋ค.
๊ทผ๋ฐ ์์ฒญ์ ๋ณด๋ด๋ณด๋ฉด axios network error๊ฐ ๋ฌ๋คใ ใ ์ด๋ฏธ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์๋ํด ๋ณด์๊ณ ๋ค ์ฑ๊ณตํ์ง ๋ชป ํ์ง๋ง ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๋ ๊น์ 1๋ถํฐ ๋ค์ ์๋ํด๋ณด๋ ค๊ณ ํ๋ค...
์ค๋ฅ๊ฐ ๋ฐ์ํ ์์ฒญ์ ํค๋๋ฅผ ๋ณด๋ฉด Content-Type
์ด application/x-www-form-urlencoded
๋ก ๋์ด ์๋ค. Content-Type
์ ๋ณด๋ด๋ ์์์ ํ์
์ ๋ช
์ํ๋ ๋ถ๋ถ์ธ๋ฐ, ๋ด ํ์ผ์ ํ์
์ image/png
์ธ๋ฐ ์ด ํ์
์ ๋ฐ๋ก ๋ช
์ํด์ฃผ์ง ์์ application/x-www-form-unlencoded
๋ก ๋ณด๋ด์ ธ์ ์๊ธฐ๋ ์ค๋ฅ์ธ๊ฐ ์ถ์๋ค. (๋ฌผ๋ก ํ์คํ์ง ์๋ค...)
axios.put(res.data.preSignedUrl, photo, {
headers: {
"Content-Type": photo.type
}
})
.then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
๊ทธ๋์ ์์ ํ๊ฒ Content-type
์ ํด๋น photo
์ ํ์
์ผ๋ก ์ง์ ํ์ฌ ๋ณด๋ด๋ณด์๋ค.
ํ์ง๋ง ์ด ๋ถ๋ถ์ด ๊ฐ์๋ ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ํ์
์ ๋ช
์์ ์ผ๋ก image/png
๋ image/*
๋ฑ์ผ๋ก ์ง์ ํด๋ ๊ฒฐ๊ณผ๋ ๊ฐ์๋ค.
reactjs - Axios AWS S3 Put Object: Error: Network Error
๋๋ ๊ฑฐ์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ๋์ stackoverflow์์ ์ฐพ์๋๋ฐ ์ ์๋ฏธํ ๋ต๋ณ์ ์๋ ๊ฒ ๊ฐ์๋ค... ์ด์ ๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง axios๋ฅผ fetch๋ก ๋ฐ๊ฟ์ ๋๋ค๋ ์ฌ๋์ด ์๊ธธ๋ ๋๋ ์๋ํด ๋ณด์๋ค. ์ค์ ๋ก axios๊ฐ ์๋ฌด๋ฆฌ fetch ๊ธฐ๋ฐ์ผ๋ก ๋์๊ฐ๋ค์ง๋ง ๋ด๋ถ ๋ก์ง์ด ๋ค๋ฅธ ์ ์ด ๋ง์์ ๋๋ ์์ ์ axios๋ฅผ fetch๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์ ์ด ์์๋ค. ๊ทธ๋์ ์ข ๊ธฐ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ํ ๋ฐฉ๋ฒ์ด์๋๋ฐ,,,
fetch(res.data.preSignedUrl, {
'body': photo,
'method': 'PUT',
'headers': {
"Content-Type": "image/*",
}
}).then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
fetch ๋ฉ์๋๋ ๋ ๋ถ์น์ ํ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฌ๋ค... Content-type
์ photo.type
์ผ๋ก ๋ฐ๊ฟ๋ณธ๋ค๋ ์ง, ์ฃผ์ ์ฒ๋ฆฌ ํด ๋ณธ๋ค๋ ์ง ๋ฑ๋ฑ์ ์๋ํด ๋ณด์๋ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
์ ๋๋ค ๐ ๋๊ฐ ์ฝ๊ฐ ๋ น์์ vscode ๊ป๋ค ์ผ ๋ณด๊ธฐ, ์ปดํจํฐ ๊ป๋ค ์ผ ๋ณด๊ธฐ ์ด๋ฐ ์์์ ์ธ ๋ฐฉ๋ฒ๊น์ง ๋ค ํด ๋ดค๋๋ฐ ์ ๋จใ
์ฌ์ค ์ด ๋ฐฉ๋ฒ์ ์๋ ๊ฒ ๊ฐ์๋๋ฐ... ์งํธ๋ผ๊ธฐ๋ผ๋ ์ก๋ ์ฌ์ ์ผ๋ก ์๋ํด ๋ณด์๋ค.
const formData = new FormData();
formData.append(photo.name, photo);
axios.put(res.data.preSignedUrl, formData, {
headers: {
"Content-Type": "multipart/form-data",
}
})
.then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
์ญ์ ๋์ง๋ ์์๋คใ ใ
const formData = new FormData();
formData.append('file', photo);
axios.put(res.data.preSignedUrl, formData, {
headers: {
"Content-Type": "multipart/form-data",
}
})
.then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
key ์ด๋ฆ์ file๋ก ํด์ผ ๋๋ค๋ ๋ง๋ ์๊ธธ๋ ํด ๋ณด์๋๋ฐ ์ ๋๋ค.
Nestjs์์ ํ์ผ ์
๋ก๋ํ๋ ๋ฐฉ๋ฒ 2ํธ - presigned url(with. presigned post)
์ฐธ๊ณ ๋ก formData๊ฐ ์๋ ๊ทธ๋ฅ { file: photo }
๊ฐ์ฒด๋ฅผ body๋ก ๋ฃ๋ ๊ฒ๋ ํด ๋ณด์๋๋ฐ ์ ๋์๋ค.
fetch๋ก ๋ณด๋ผ ์์ฒญ์ new Request()
๋ก ์์ฑํด ๋ณด์๋ค. ๊ทธ๋ฅ ์์ ์ฝ๋ ์ค์ ์ด๋ ๊ฒ ์๋ํด ๋ณธ ์ฌ๋๋ ์๊ธธ๋ ํด ๋ณธ ๋ฐฉ๋ฒ์ด๊ณ ์ฌ์ค ์ด๊ฑธ๋ก ํด๊ฒฐ๋ ๊ฐ๋ฅ์ฑ์ ๋งค์ฐ ๋ฎ์์ง๋ง... (์๋๋ฉด ๊ทธ๋ฅ ์๋ ๋ณด๋ด๋ fetch๋ ๋๊ฐ์ผ๋๊น...) ํน์๋ ๋ด๊ฐ ๋ชจ๋ฅด๊ณ ์๋ ๋ถ๋ถ์ด ์์ ์๋ ์์ผ๋๊น ์๋ํด ๋ณธ ๋ฐฉ๋ฒ์ด๋ค.
fetch(new Request(
res.data.preSignedUrl, {
method: 'PUT',
body: photo,
headers: new Headers({
'Content-Type': "image/*",
}),
}
)).then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
์ญ์ ์ ๋๋ค ํคํผ ๊ทผ๋ฐ ์๊ฐ response๊ฐ ์ข ๋๋ฆฌ๊ฒ ์์ ๋ ์ค ์๊ณ ๊น์ง ๋๋ ใ ใ
๋ฐฑ์๋์์ postman์ผ๋ก ํ
์คํธํ ๋๋ ์ ๋ณด๋ด์ง๊ธธ๋ ๋ด๋ดค๋๋ฐ binary ํํ๋ก ๋ณด๋ด๊ณ ์๊ธธ๋ binary๋ก ๋ณํํด์ ๋ณด๋ด๋ณด๋ ๋ฐฉ๋ฒ๋ ์๋ํด ๋ณด์๋ค... ์ฌ์ค ๊ทธ๋ฅ File ๊ฐ์ฒด์งธ๋ก ๋ณด๋ด๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ ์ถ๊ธด ํ๋ฐ ์๋์ผ๋ก ์ค์ ๋๋ Content-Type์ x-www-form-urlencoded
๊ธธ๋ ํน์๋ ํด์...
function readFileAsBinary(file: File) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const arrayBuffer = reader.result;
resolve(arrayBuffer);
};
reader.onerror = reject;
reader.readAsArrayBuffer(file);
});
}
...
readFileAsBinary(photo)
.then((response) => {
axios.put(res.data.preSignedUrl, response)
.then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
...
ํ์ง๋ง ์ญ์ ๋๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค...
readFileAsBinary(photo)
.then((response) => {
axios.put(res.data.preSignedUrl, response, {
headers: {
"Content-Type": 'application/octet-stream'
}
})
.then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
ํน์ Content-Type
์ application/octet-stream
์ผ๋ก ์ง์ ํด์ค ๋ณด๋ฉด ์ด๋จ๊น ์ถ์ด์ ์ง์ ํด ๋ดค๋๋ฐ ํด๊ฒฐ๋์ง๋ ์์๋ค ใ
ใ
png ํ์ผ๋ก๋ง ํ ์คํธ ํด ๋ณด์๋๋ฐ ํน์ ๋ค๋ฅธ ํ์ฅ์(jpg ๋ฑ๋ฑ...) ํ์ผ๋ก ํ๋ฉด ๋ ๊น ์ถ์ด์ ์๋ํด ๋ณด์๋ค... ๊ทผ๋ฐ ์๋ฒ ์ชฝ์์๋ png ํ์ผ๋ก ํ ์คํธํ๊ณ ์ฑ๊ณตํ์ด์ ์ด๊ฑด ์๋ ๊ฒ ๊ฐ์ง๋ง ๊ทธ๋๋...
์์ ์ ์ปจํผ๋ฐ์ค ๊ฐ์ ์ฐ์๋ ์ฌ์ง์ผ๋ก ํด ๋ณด์๋๋ฐ ์ ๋๋ค ใ ใ
pre-signed url์ https
๋ก ๋์ด ์๊ณ , ๋๋ ๋ด ๋ก์ปฌ์์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ http
๋ก ๋์ด ์๋ค. ํน์ ์ด๊ฒ ๋ฌ๋ผ์ ๋ฌธ์ ์ธ๊ฐ ์ถ์ด์ pre-signed url์ http
๋ก ๋ฐ๊พธ์ด์ ์์ฒญํด ๋ณด์๋ค. ๋ฐ๊ฟจ๋๋ ๋๋ค๋ ์ฌ๋์ ๋ฐ๊ฒฌํด์ ํฌ๋ง์ ๊ฐ์ง๊ณ ์๋ํด ๋ณด์๋ค. ์ฐธ๊ณ ํ ๋งํฌ๋ ์ฌ๊ธฐ์๋ค.
const link = (res.data.preSignedUrl).replace(/https/, 'http');
axios.put(link, photo, {
headers: {
"Content-Type": photo.type
}
}).then((res) => {
console.log(res);
}).catch((err) => {
console.error(err);
})
๋๋ ๋ฐ๊ฟ๋ ์ ๋๋ ์ฌ๋์ด์๋ค.
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ใ
ํ์์ผ๋ถํฐ ์ด๊ฒ ๋๋ฌธ์ ๋ฏธ์น๊ฒ๋ค
์๋ ค๊ณ ๋์ ๋ค๊ฐ๋ ์ด๊ฑด๊ฐ? ์ถ์ผ๋ฉด ๋ค์ ์ผ์ด๋์ ์ฝ๋ ์น๊ณ ์ด๋ฌ๋๋ฐ
์ด๋ ๊ฒ ๋ฉฐ์น ๋์ ํด๊ฒฐ ์ ๋๋ ์ค๋ฅ ๋๋ฌด ์ค๋๋ง์ ๋ง๋์ ๋ฉํ์ด ์ฝํด์ก๋ค...
๋ฐ์นญ ๊ธฐ๊ฐ์ด ์ผ๋ง ๋จ์ง ์์์ ์ด ๋ฌธ์ ๋ ๋์ค์ ๋ค์ ํด๊ฒฐํด ๋ณผ ์๋ฐ์ ์์ ๊ฒ ๊ฐ๋ค.
๋ผ์ํ์ง๋ง ์์ฆ ์๋งํ๋๋ฐ ์์ง ๋ฉ์๋ค๋ ๊ฑธ ์๊ฒ ํด ์ค ์ข์ ๊ฒฝํ์ด์๋ค. ^^
zใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ํ,, ๊ฐ์ด ๋๋ฌผ ํ๋ฆฌ๊ณ ๊ฐ๋๋ค
zใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ํ,, ๊ฐ์ด ๋๋ฌผ ํ๋ฆฌ๊ณ ๊ฐ๋๋ค
๋ต์ ์ฐพ์ผ์ จ๊ธธ ๊ธฐ์ํฉ๋๋ค.
์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋๋ฐ,
ํ์ผ์ด ํด๋ผ์ฐ๋์ ์๋ ๊ฒฝ์ฐ ์์๊ฐ์ ์ค๋ฅ๊ฐ ๋๋ค์.