90064


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）は大体８Mぐらいで１つずつアップロードします。)

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

入力フォーム

[code]

    <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>
    
[/code]

フォームリクエスト

[code]

    <?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'=>'ファイルの形式が正しくありません。',
            ];
        }
    }
    
[/code]

ルーティング

[code]

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

コントローラ

[code]

    <?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');
      }
    }
    
[/code]

モデル

[code]

    <?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;
        }
    }
    
[/code]

テーブル

[code]

    <?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');
        }
    }
    
[/code]

自分で試したこと  
php.info確認、formタグにenctype="multipart/form-data"追加


CC BY-SA 4.0
2022-06-18T04:30:16.277
89455
2022-07-18T12:34:57.067
2022-06-18T04:43:45.487
53126
53126
question
php mysql laravel
音声ファイルをデータベースにアップロードできない。


貼って頂いたコードは、ファイルアップロードに関連する部分は特に問題ないように見えます。  
ご推察の通りphp自体の設定やそれ以前のWebサーバやサーバ自体に原因がある気がしますね。

解決に至るか分からないのですが、次のことを試してみてください。

  1. `(UploadRequest $request)` を一時的に `(Request $request)` に変更する。 
    * スクリプト冒頭に `use Illuminate\Http\Request;` が無かった場合はそれも必要
    * この変更でアップロード失敗時もコントローラーまで処理が来るようになる（今は来てないはず）
  2. アップロード処理の冒頭で `dd($request->file('file')->getError());` とする 
    * 一時的にバリデーションを外した状態でアップロード失敗時のエラーメッセージをブラウザに表示
  3. 普段失敗している時と同じ方法でサイドアップロードしてみる。 
    * 上で仕込んだ `dd()` からのエラーメッセージが表示されるかもしれません。

もしこれでエラーを表示することが出来た場合、そこに原因が書いてある可能性があります。

ここから先はLaravelではなくphpになりますが、phpのファイルアップロード処理に影響を与える設定は冒頭の4つの他にもあります。

PHP: POST メソッドによるアップロード - Manual  
<https://www.php.net/manual/ja/features.file-upload.post-method.php>  
注意: 関係する設定に関する注記

> php.iniの file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size, >
> max_input_time ディレクティブも参照ください。

今回の原因になっているかは分からないんですが `upload_tmp_dir`
辺りは環境依存のエラーを引き起こしやすいですね。アップロードしたファイルをphpが一時的に保存しておくディレクトリの問題（多くの場合ディスク容量や書き込み権限）が原因だった、ということが経験上は多いです。今回の原因になっているかは解りません。


CC BY-SA 4.0
2022-07-18T12:34:57.067
90064
2022-07-18T12:34:57.067
53573
89455
answer