upload.html
<div id="app">
<!-- ์ฒจ๋ถํ์ผ ์์ญ ์์ -->
<div class="field-head">
์ฒจ๋ถํ์ผ<span class="text-red"></span>
<span id="extensions" class="text-red">[.jpg, .jpeg, .png, .xlsx, .hwp, .docx, .pptx, .pdf]</span>
<div class="util-box">
<!-- ํ์ผ ๋ฐฐ์ด์ด 5๊ฐ๋ณด๋ค ํฌ๋ฉด ๋นํ์ฑํ --> <!-- @click.prevent๋ก aํ๊ทธ์ ๊ธฐ๋ณธ๊ฐ์ ๋ง๋๋ค. -->
<a href="#" :disabled="files.length >= 5" @click.prevent="addAttachFile"><span class="material-icons">add</span></a>
<a href="#" @click.prevent="removeAttachFile"><span class="material-icons">remove</span></a>
</div>
</div>
<div class="field-box" id="fileBox">
<!-- hasAttachment๊ฐ false์ผ ๋๋ง ํ์๋๋ค. -->
<div class="a_c bg-light" v-show="!hasAttachment"> <br>
ํ์ฅ์๋ .jpg, .jpeg, .png, .xlsx, .hwp, .docx, .pptx, .pdf ๋ง ๊ฐ๋ฅํฉ๋๋ค. <br>
5MB์ดํ ํ์ผ๋ง ์ฌ๋ ค์ฃผ์ธ์.
</div>
<!-- ์ฌ๊ธฐ๊ฐ ํต์ฌ -->
<ul classname="file-list">
<!-- Vue.js์ ์ธ์คํด์ค์ files ํฌ๊ธฐ๋งํผ ๋ฃจํ -->
<li v-for="(item, index) in files" :key="index">
<div class="flex-box frm-file mt05">
<span>{{ item.num }}</span><span class="mr5">.์ฒจ๋ถ</span>
<!-- file1, file2, file3 ์ด๋ฐ์์ผ๋ก ์ธํ
ํ๊ธฐ ์ํจ์ด๋ค. -->
<input type="text" ref="'file' + item.num" title="" class="input-default file-txt">
<input type="file"
:id="'filefrm' + item.num"
ref="'filefrm' + item.num"
class="btn-file"
title="ํ์ผ์ฐพ๊ธฐ"
accept=".jpg, .jpeg, .png, .xlsx, .hwp, .docx, .pptx, .pdf"
<!-- ์ฒด์ธ์ง ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ฐ๊ฒฐ -->
@change="handleFileChange($event, index)"
>
<label :for="'filefrm' + item.num">ํ์ผ ์ฒจ๋ถ</label>
</div>
</li>
</ul>
</div>
</div>
<button type="button" @click="reg" class="btn btn-normal">์ ์ฅ</button>
<script>
// ๊ธฐ์กด ์ฝ๋๋ฅผ ํธ์งํด์ {} ์ด๊ณ ๋ซ๋๊ฒ ์ ๋ง์ ์๋ ์์
new Vue({
//element id
el: '#app',
//vue์์ ๊ด๋ฆฌํ ๋ฐ์ดํฐ
data: { files: [], //์ฒจ๋ถํ์ผ
hasAttachment: false, // flag ์ฉ๋
},
methods: {
/**
* ๋ฑ๋ก
*/
reg() {
const self = this; // ์ธ์คํด์ค ์ฐธ์กฐ ๋ณ์
if (confirm("๋ฑ๋ก์ ํ์๊ฒ ์ต๋๊น?")) {
//formdata ์๋ก์ด ๊ฐ์ฒด ์์ฑ
const formData = new FormData();
//์ฒจ๋ถํ์ผ ์ธํ
for (const fileData of this.files) {
if (fileData.file) {
formData.append('files', fileData.file);
}
}
const url = '/api/file';
//post http request
axios.post(url, formData, {
headers: { 'Content-Type': 'multipart/form-data' }
})
.then(function(response) {
console.log(response.data.code);
if(response.data.code === '1') {
alert("๋ฑ๋ก๋์์ต๋๋ค.");
location.href = "/";
} else {
alert("๋ฑ๋ก์ ์คํจ ํ์ต๋๋ค.");
}
}.bind(this))
.catch(function(error) {
alert("๋ฑ๋ก์ ์คํจ ํ์ต๋๋ค.");
console.log(error);
});
}
}
},
/**
* ์ฒจ๋ถํ์ผ ์์ญ ์ถ๊ฐ
*/
addAttachFile() {
if(this.files.length >= 5) {
alert("์ฒจ๋ถํ์ผ์ 5๊ฐ๊น์ง ๋ฑ๋ก ๊ฐ๋ฅํฉ๋๋ค");
return false;
}
this.files.push({ name: `Files ${this.files.length + 1}`, file: null, num: this.files.length + 1});
this.hasAttachment = true;
},
/**
* ์ฒจ๋ถํ์ผ ์์ญ ์ญ์
*/
removeAttachFile() {
if (this.files.length > 0) {
this.files.pop();
}
if (this.files.length === 0) {
this.hasAttachment = false;
}
},
/**
* ์ ํ๋ ์ฒจ๋ถํ์ผ ์ธํ
* @param event
* @param index
*/
handleFileChange(event, index) {
const selectedFile = event.target.files[0];
this.files[index].file = selectedFile;
},
});
</script>
์ ์ฝ๋๋ ๋์ ์ผ๋ก ์ฒจ๋ถํ์ผ ์์ญ์ ์ถ๊ฐ/์ญ์ ํ ์ฒจ๋ถํ์ผ์ ์ ๋ก๋ ํ๋ ๊ฐ๋จํ ์์ ์ด๋ค.
์ ์ฒด์ ์ผ๋ก ํฌ์คํ ์ ์ํด ํธ์งํ ์ฝ๋๋ผ์ ํ๊ทธ ์ด๊ณ ๋ซ๊ณ ์ ๋ง์ ์๋ ์๋ค.
์ฒจ๋ถํ์ผ ๊ด๋ จ ๋ฉ์๋๋ ์ด 4๊ฐ์ด๋ค.
์ฒจ๋ถํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ฐฐ์ด์ด ์ธ์คํด์ค์ data ๊ฐ์ฒด์์ ์ด๊ธฐํ ๋ ์ํ์ด๊ณ
addAttachFile(), removeAttachFile()๋ก data ๊ฐ์ฒด์ files ๋ฐฐ์ด์ ๊ฐ์ ์ถ๊ฐ/์ญ์ ํ๋ค.
๋ฐฐ์ด์ ๊ฐ์ ์ถ๊ฐ/์ญ์ ํ ํ๋ฉด์ ์ฐ๊ฒฐํด์ฃผ๋ฉด Vue.js์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ๊ฐ์ง๋ฅผ ํด์ ์์์ ํ์ํด์ค๋ค.
์ถ๊ฐ ์ ๋ฐฐ์ด์ name, file, num์ ์ถ๊ฐํ๋ค.
์ฒจ๋ถํ์ผ ์์ญ์์๋ ๋์ ์ผ๋ก ์ค์ ๋๋ files๋ฐฐ์ด์ ํฌ๊ธฐ๋งํผ ๋ฃจํ๋ฅผ ๋์์ ํ๋ฉด์ ๋ ๋๋ง ๋๊ณ
์ฒจ๋ถํ์ผ ์ถ๊ฐ ์ handleFileChange() ๋ฉ์๋๋ฅผ ํตํด์ ํ์ผ์ files ๋ฐฐ์ด์ ์ธํ ํ
์๋ฒ ์ ์ก ์ ์ฒจ๋ถํ์ผ ๋ฆฌ์คํธ๋งํผ formData์ ์ธํ ํ multipart/form-data ํ์ ์ผ๋ก ๋ณด๋ด๊ณ
๊ฒฐ๊ณผ์ฝ๋์ ๋ฐ๋ผ ๋ถ๊ธฐ์ฒ๋ฆฌํ๋ค.
'IT > development' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[springBoot] daum SMTP ๋ฉ์ผ ๋ฐ์ก (43) | 2023.08.22 |
---|---|
[github] github ์น vs code ์ฌ์ฉ (0) | 2023.08.17 |
[JavaScript] ํ ํ๋ฆฟ ๋ฌธ์์ด ์ฌ์ฉ๋ฒ(feat. '(๋ฐฑํฑ)) (2) | 2023.08.13 |
[JavaScript] ์์ ํ์ ์ฐฝ์์ ๋ถ๋ชจ์ฐฝ์ ํจ์ ํธ์ถ(javascript ์์ฃผ) (0) | 2023.08.13 |
[springBoot] ์๋ก ๋ค๋ฅธ branch๋ฅผ ๋์์ ๋์ฐ๋ ค๋ฉด? (0) | 2023.08.12 |
๋๊ธ