Coding Planet
AJAX๋ฅผ ์ด์ฉํ ํ์ผ ๋ค์ด๋ก๋ ์ ํ๊ธ ํ์ผ๋ช ๊นจ์ง ๋ฌธ์ ํด๊ฒฐํ๊ธฐ ๋ณธ๋ฌธ
๐ป Java Study/Java ์ด๋ก ์ ๋ฆฌ
AJAX๋ฅผ ์ด์ฉํ ํ์ผ ๋ค์ด๋ก๋ ์ ํ๊ธ ํ์ผ๋ช ๊นจ์ง ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
jhj.sharon 2024. 7. 25. 14:39๋ฐ์ํ
๋ฌธ์ ์ํฉ ์ค๋ช
์ต๊ทผ ํ๋ก์ ํธ์์ AJAX๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก๋ถํฐ ํ์ผ์ ๋ค์ด๋ก๋ํ ๋ ํ๊ธ ํ์ผ๋ช ์ด ๊นจ์ง๋ ํ์์ ๊ฒช์๋ค. ๋์ผํ ํ์ผ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ์ form ์ ์ถ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ ๋๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์๋ค.
- 882ECA99EEB84A7ECB18FEDB5B3%84_240715-240726.xlsx -> ์ด๋ฐ์์ผ๋ก ํ๊ธ ๊นจ์ง
์์ธ ๋ถ์
AJAX์ form ์ ์ถ ๋ฐฉ์์ ์ฐจ์ด์
- Form ์ ์ถ ๋ฐฉ์: ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ์ ํ์ฉํ๋ค. ๋ธ๋ผ์ฐ์ ๋
Content-Disposition
ํค๋๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ํ์ผ๋ช ์ธ์ฝ๋ฉ์ ์์์ ์ฒ๋ฆฌํ๋ค. ๋ฐ๋ผ์ Form ํ์์ ํ์ผ๋ค์ด๋ก๋์์๋ ํ์ผ๋ช ์ด ์ ๋๋ก ์ถ๋ ฅ๋ฌ๋ค. - AJAX ๋ฐฉ์: XMLHttpRequest ๋๋ Fetch API๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ํ์ผ์ ์์ฒญํ๊ณ , JavaScript๋ก ํ์ผ ๋ค์ด๋ก๋๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ด ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์, ํ์ผ๋ช ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ผ ํ๋ค. AJAX ๋ฐฉ์์์๋ ์๋ฒ์์ ๋ณด๋ด๋ Content-Dispositionํค๋๋ฅผ ๊ทธ๋๋ก ๋ฐ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์ถ๊ฐ์ ์ธ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
Content-Disposition ํค๋ ์ฒ๋ฆฌ ๋ฐฉ์
Content-Disposition
ํค๋๋ ํ์ผ ๋ค์ด๋ก๋ ์ ํ์ผ๋ช ์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด ํค๋๋ ASCII ๋ฌธ์๋ง์ ์ง์ํ๊ธฐ ๋๋ฌธ์, ํ๊ธ ํ์ผ๋ช ์ ์ธ์ฝ๋ฉ๋์ด ์ ๋ฌ๋์ด์ผ ํ๋ค.- RFC 5987 ํ์ค์ ์ฌ์ฉํ๋ฉด ํ์ผ๋ช ์ UTF-8๋ก ์ธ์ฝ๋ฉํ ์ ์๋ค.
- ** RFC 5987์ ๋ํ ๊ฐ๋จํ ์ค๋ช : RFC 5987์ HTTP ํค๋ ํ๋์ ๊ตญ์ ํ๋ ๋ฌธ์์ด์ ์ฌ์ฉํ ์ ์๋๋ก ์ ์ํ ํ์ค์ด๋ค. ์ด ํ์ค์ ๋ฐ๋ฅด๋ฉด, UTF-8๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ํค๋ ํ๋์ ํฌํจ์ํฌ ์ ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋ ์์ ๋ด์ฉ
- ํด๋ผ์ด์ธํธ ์ธก์์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ํ์ผ๋ช ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ธ์ฝ๋ฉํ์ฌ ์ฒ๋ฆฌ
์๋ฒ ์ธก ์ฝ๋ ์์ ๋ด์ฉ
- ์๋ฒ ์ธก์์๋ Content-Disposition ํค๋์ ํ์ผ๋ช ์ UTF-8๋ก ์ธ์ฝ๋ฉํ์ฌ ์ค์
์ฝ๋ ์์
1. ๋ฌธ์ ๊ฐ ์๋ ์๋ ์ฝ๋
ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋
fetch('/download', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
})
.then(response => response.blob())
.then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'ํ์ผ๋ช
.xlsx'; // ํ๊ธ ํ์ผ๋ช
๊นจ์ง
document.body.appendChild(a);
a.click();
a.remove();
});
์๋ฒ ์ธก ์ฝ๋
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=\"ํ์ผ๋ช
.xlsx\"");
2. ์์ ๋ ์ฝ๋
ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋
fetch('/download', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
})
.then(response => {
const disposition = response.headers.get('Content-Disposition');
const filename = disposition.match(/filename\*?=['"]?([^;\n"]*)['"]?/)[1];
const decodedFilename = decodeURIComponent(filename.replace(/\+/g, ' '));
return response.blob().then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = decodedFilename;
document.body.appendChild(a);
a.click();
a.remove();
});
});
์๋ฒ ์ธก ์ฝ๋
import org.apache.commons.codec.net.URLCodec;
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
String fileName = "ํ์ผ๋ช
.xlsx";
URLCodec codec = new URLCodec();
String encodedFileName = codec.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
์ฐธ๊ณ ์๋ฃ
๊ด๋ จ RFC ๋ฌธ์ ๋งํฌ
- RFC 5987: HTTP ํค๋ ํ๋์ ๋ํ ๊ตญ์ ํ๋ ๋ฌธ์์ด ์ง์
๊ธฐํ ๋์์ด ๋ ์๋ฃ๋ค
๋ฐ์ํ
'๐ป Java Study > Java ์ด๋ก ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Comments