@kokikoki800

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

音声ファイルのDBアップロード

解決したいこと

音声ファイルをデータベースにアップロードできない。

Laravelで音楽プレイヤーを作成しています。
プレイリストに追加したい曲をフォームからDB(MySQL)にアップロードしたいのですが、画面にThe file failed to upload.とエラーが出ます。(ファイルを選択ボタンの下)
フォーム入力 -> フォームリクエストによりバリデーション -> コントローラーでEloquantによりDB追加 という流れです。
なお、file_uploads、post_max_size、max_file_uploads、upload_max_filesizeなどは全て問題ありませんでした。
(file_uploads = On、post_max_size = 32M、max_file_uploads = 20、upload_max_filesize =32M、音声ファイル(mp3)は大体8Mぐらいで1つずつアップロードします。)

どこを改善すれば良いのかご教示いただけると幸いです。

入力フォーム

<body>
  <div class="form">
    <div>
      <p class="add">楽曲追加</p>
    </div>
    <form action="/upload" method="post" enctype="multipart/form-data">
    @csrf
    <input type="hidden" name="id">
    <div>
      <input type="text"  name="title" placeholder="楽曲" value="{{old('title')}}">
      @error('title')
      <p class="message">{{$message}}</p>
      @enderror
    </div>
    <div>
      <input type="text"  name="artist" placeholder="アーティスト" value="{{old('artist')}}">
      @error('artist')
      <p class="message">{{$message}}</p>
      @enderror
    </div>
    <div>
      <input type="file" name="file"required>
    </div>
    <div>
      @error('file')
      <p class="message">{{$message}}</p>
      @enderror
    </div>
    <div>
      <button>アップロード</button>
    </div>
    </form>
  </div>

</body>

フォームリクエスト

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UploadRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title'=>'required',
            'artist'=>'required',
            'file'=>'required|max:1600|mimes:mp3,wave,aif,aac,mp4',
        ];
    }

    public function messages()
    {
        return [
            'title.required'=>'楽曲名を入力してください。',
            'artist.required'=>'アーティスト名を入力してください。',
            'file.required'=>'ファイル名を入力してください。',
            'file.max'=>'1.6MBを超えるファイルは添付できません。',
            'file.mimes'=>'ファイルの形式が正しくありません。',
        ];
    }
}

ルーティング

//楽曲追加画面表示
Route::get('/upload',[UploadController::class,'add']);

//楽曲追加
Route::post('/upload',[UploadController::class,'create']);

コントローラ

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\UploadRequest;
use App\Models\Music;

class UploadController extends Controller
{ 
  public function add(){
      return view('upload');
  }
  public function create(UploadRequest $request){
      $form = $request->all();
      Music::create($form);
      return redirect('/upload');
  }
}

モデル

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Music extends Model
{
    protected $guarded = [
        'id',
    ];
    public static $rules = [
        'user_id' => 'required',
        'title' => 'required',
        'artist' => 'required',
        'file' => 'required',
    ];
    public function getTitle(){
        return $this->title . ' / ' . $this->artist;
    }
}

テーブル

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMusicTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('music', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id');
            $table->string('title');
            $table->string('artist');
            $table->binary('file');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('music');
    }
}

自分で試したこと

php.info確認、formタグにenctype="multipart/form-data"追加

0 likes

1Answer

file_uploads、max_file_uploads、upload_max_filesizeなどは全て問題ありませんでした。
php.info確認

どのような状態で「問題ない」という判断なのか、確認した結果どのようになっていたのか、という点について記載がなのでヒントがあるようで無い状態になっています。

具体的な設定値、phpinfoの情報、アップロードしようとしているファイルの情報(形式やサイズ等)の情報が必要です。
あとPHPのpost_max_size設定も確認が必要です。

The file failed to upload.とエラーが出ます。

エラーについても、もっと詳細が記載されていると分かりやすいです。

  • どこにエラーが出ているのか。画面なのか、コンソールなのか、ログファイルなのか、etc..
  • バリデーションエラーなのか、プログラムのエラーなのか、データベースのエラーなのか
  • 発生している行数やスタックトレースなど
0Like

Comments

  1. @kokikoki800

    Questioner

    ご指摘いただき、ありがとうございます。
    更新しましたので、ご確認いただけましたら幸いです。
    >バリデーションエラーなのか、プログラムのエラーなのか、データベースのエラーなのか
    >発生している行数やスタックトレースなど
    この辺の調べ方がいまいちわかりません。
    検証ツールでは特に問題は起きていませんでした。(コンソールなど)
  2. 設定値はphpinfoで確認したものですか?
    参照しているphp.iniが異なるケースもあります。

    ファイルはアップロードできますか?
    - 他のmp3ファイル
    - mp3以外の音楽ファイル
    - 音楽ファイル以外(mimesを変更して)
    - もっとサイズが小さいファイル(例えばKバイト単位)


    マシンの容量が足りなかった、というケースもあるようです。
    https://teratail.com/questions/104699

    陥りやすい落とし穴
    https://www.php.net/manual/ja/features.file-upload.common-pitfalls.php
  3. @kokikoki800

    Questioner

    返信遅れてしまい大変申し訳ありません。
    >設定値はphpinfoで確認したものですか?
      参照しているphp.iniが異なるケースもあります。
    4MBのmp3ファイルと30MBのWAVファイルのアップロードをそれぞれ試みましたが、前者はThe file failed to upload.後者はPostTooLargeException (limit 8MB)とエラーが出ます。
    後者のエラーから参照しているphp.iniが違うことが分かりましたが、使用しているphp7.4のファイル配下のphpiniファイルではないのでしょうか?
    また数KBのファイルは問題なくアップロードできました。

Your answer might help someone💌