ファイルを含むInertiaリクエスト(ネストされたファイルも含む)を行う場合、Inertiaはリクエストデータを自動的にFormData
オブジェクトに変換します。この変換は、 multipart/form-data
リクエストをXHR経由で送信するために必要です。
データにファイルが存在するかに関わらず、常にFormData
オブジェクトを使用したい場合は、リクエスト時にforceFormData
オプションを指定できます。
import { router } from '@inertiajs/vue3'
router.post('/users', data, {
forceFormData: true,
})
FormData
インターフェースの詳細については、 MDNドキュメント.
FormData
に変換されませんでした。このバージョンより前のInertiaを使用している場合は、手動で変換する必要があります。Inertiaを使った完全なファイルアップロードの例を見てみましょう。この例には、name
テキスト入力とavatar
ファイル入力の両方が含まれています。
<script setup>
import { useForm } from '@inertiajs/vue3'
const form = useForm({
name: null,
avatar: null,
})
function submit() {
form.post('/users')
}
</script>
<template>
<form @submit.prevent="submit">
<input type="text" v-model="form.name" />
<input type="file" @input="form.avatar = $event.target.files[0]" />
<progress v-if="form.progress" :value="form.progress.percentage" max="100">
{{ form.progress.percentage }}%
</progress>
<button type="submit">Submit</button>
</form>
</template>
この例では、フォームヘルパーが現在のアップロードの進捗状況に簡単にアクセスできるため、便宜上Inertiaフォームヘルパーを使用しています。ただし、 手動によるInertiaアクセスでもフォームを送信できます。
multipart/form-data
リクエストを使用したファイルアップロードは、PUT
、PATCH
、またはDELETE
HTTPメソッドを使用する場合、一部のサーバーサイドフレームワークではネイティブにサポートされていません。この制限に対する最も簡単な回避策は、代わりにPOST
リクエストを使用してファイルをアップロードすることです。
ただし、 Laravelや Railsなどの一部のフレームワークでは、フォームメソッドのスプーフィングがサポートされています。これにより、POST
を使用してファイルをアップロードできますが、フレームワークはリクエストをPUT
またはPATCH
リクエストとして処理します。これは、 _method
属性をリクエストデータに含めることで行います。
import { router } from '@inertiajs/vue3'
router.post(`/users/${user.id}`, {
_method: 'put',
avatar: form.avatar,
})