首页 > 解决方案 > Laravel 6 $request->file('myfile') 总是返回 null

问题描述

我对 Laravel 6 有疑问。

无论我尝试了什么,它总是在 dump 时返回 null $request->file('filename')。我试图转储原生 php $_FILES 并返回空数组。

如果我做 $request->get('filename') 我可以得到文件内容这很奇怪。

我的 Vue 组件

<template>
    <div class="container">
        <div v-if="errors" class="errors">
            <p>{{errors}}</p>
        </div>
        <form @submit.prevent="upload" enctype="multipart/form-data">
            <div class="form-input">
                <input type="file" name="csv" @change="onInputChange">
            </div>
            <div class="form-input">
                <input type="checkbox" name="save_to_database" v-model="form.save_to_database">
                <label>Save to database</label>
            </div>
            <div class="form-input">
                <button type="submit" class="submit-btn" :disabled="form.csv_file == ''">Submit</button>
            </div>
        </form>

        <div>
            <p>
                <strong>Avg price:</strong>
                {{ average_price }}
            </p>
            <p>
                <strong>Total houses sold:</strong>
                {{ total_houses_sold }}
            </p>
            <p>
                <strong>No of crimes in 2011:</strong>
                {{ number_of_crimes }}
            </p>
            <p>
                <strong>Avg price per year in London area</strong>
                {{ avg_price_per_year_london }}
            </p>
        </div>
    </div>
</template>

<script>
    export default {

        data(){
            return {
                errors: '',
                form: {
                    csv: '',
                    save_to_database: false
                },
                average_price: 0,
                total_houses_sold: 0,
                number_of_crimes: 0,
                avg_price_per_year_london: 0
            }
        },

        methods: {
            onInputChange(e){
                let csv = e.target.files;

                if (!csv.length){
                    return;
                }

                let reader = new FileReader();
                reader.readAsText(csv[0]);
                reader.onload = (e) => {
                    this.form.csv = reader.result;
                };
            },

            upload(){
                let form_data = new FormData();

                form_data.append('csv', 'sadasda')
                form_data.append('save_to_database', this.form.save_to_database);

                const config = {
                    headers: { 'content-type': 'multipart/form-data' }
                }

                axios.post('/api/upload_csv', form_data, config)
                    .then(response => {

                    })
                    .catch(error => this.errors = error)
            },
        },

    }
</script>

路线

web.php
Route::get('/{any}', 'AppController@index')->where('any', '.*');
api.php
Route::post('upload_csv', 'UploadCsvFileController@uploadFile');

控制器.php

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Storage;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;

class UploadCsvFileController extends Controller
{
    public function uploadFile(Request $request)
    {

        dd($request->file('csv')); // null
        dd($_FILES); // [] Whyyyyy???
        dd($request->get('csv')); // returns output


    }
}

标签: laravelfile-upload

解决方案


您只在那里发布 2 个密钥csvsave_to_database但是,您还需要发送文件。为此,您应该将代码更新为:

onInputChange(e){
   let csv = e.target.files;
   
   if (!csv.length) {
     return;
  }
  
   this.form.my_file = csv[0] /// add this

   ...

并更新:

let form_data = new FormData();

form_data.append('my_file',  this.form.my_file) // add this

之后,您将能够在服务器端获取文件:

$request->file('my_file')

推荐阅读