Vue.jsでフォームを扱う際、画像やPDFなどのファイルをサーバーへアップロードする機能は非常に重要です。特に業務アプリや管理画面では、ユーザーが添付ファイルを登録できるインターフェースが求められます。この記事では、Axiosを使ってファイルをアップロードする基本的な手順を紹介します。
実装の流れ
Vue.jsでファイルをアップロードする基本的なステップは以下の通りです:
- <input type=”file”>でファイルを選択
- 選択したファイルを
FormData
で送信形式に変換 - Axiosを使ってPOSTリクエストでサーバーへ送信
テンプレート部分の記述
<template>
<form @submit.prevent="handleUpload">
<input type="file" @change="onFileChange" />
<button type="submit">アップロード</button>
</form>
<p v-if="uploadSuccess">アップロード成功!</p>
</template>
スクリプト部分(Composition API)
<script setup>
import { ref } from 'vue'
import axios from 'axios'
const selectedFile = ref(null)
const uploadSuccess = ref(false)
const onFileChange = (event) => {
selectedFile.value = event.target.files[0]
}
const handleUpload = async () => {
if (!selectedFile.value) return
const formData = new FormData()
formData.append('file', selectedFile.value)
try {
const response = await axios.post('/api/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
console.log('アップロード成功', response.data)
uploadSuccess.value = true
} catch (error) {
console.error('アップロード失敗', error)
uploadSuccess.value = false
}
}
</script>
バックエンド側の受け取り例(Node.js/Express)
参考までに、Node.js + Express で受け取る側のサンプルです。multer
を使ってファイルを処理します。
const express = require('express')
const multer = require('multer')
const upload = multer({ dest: 'uploads/' })
const app = express()
app.post('/api/upload', upload.single('file'), (req, res) => {
console.log(req.file)
res.send({ status: 'success' })
})
複数ファイル対応にするには
複数ファイルを選択できるようにする場合は、以下のように変更します:
<input type="file" multiple @change="onFilesChange" />
const onFilesChange = (event) => {
const files = event.target.files
for (let i = 0; i < files.length; i++) {
formData.append('files[]', files[i])
}
}
まとめ
Vue.jsでのファイルアップロードは、FormData
とAxios
を使えば簡単に実装できます。入力フォームの一部として自然に組み込めるため、画像・PDF・CSVなど様々な用途に対応可能です。セキュリティ対策として、ファイルサイズ制限や拡張子のチェックなども併せて実装しておくと実用的です。