Laravel, как сделать несколько загрузок файлов и хранить данные в двух таблицах - PullRequest
1 голос
/ 24 сентября 2019

У меня есть <form>, где можно загрузить несколько файлов.Несколько файлов должны храниться в другой таблице, но по какой-то причине файлы не сохраняются в database.

. Вот форма:

<form method="POST" action="{{ route('application.store') }}" id="form" enctype="multipart/form-data">
   <input name="name" type="text" />
   <input name="email" type="text" />
   <input name="phone" type="text" />
   <input name="additional_files" type="file" multiple />
</form>

Затем в моем контроллере яиметь это:

public function store()
{
    $validator = Validator::make(
        request()->all(),
        [
            'email' => ['required', 'email'],
            'name' => ['required', 'string'],
            'phone' => ['required', 'string']
        ],

    );

    if ($validator->fails()) {
        return response()
            ->json($validator->messages(), 400);
    }


    $application = Application::create([
        'email' => request()->email,
        'name' => request()->name,
        'phone' => request()->phone,
    ]);

    if (request()->hasFile('additional_files')) {
        $files = request()->file('additional_files');
        foreach ($files as $file) {

            $filename = $file->getClientOriginalName();
            $extension = $file->getClientOriginalExtension();
            $filesize = $file->getSize();

            $path = Storage::disk('local')->put('attachments', request()->file($filename));
            $attachment_file = ApplicationFile::create([
                'files_id' => $application->id,
                'application_id' => $application->id,
                'attachment' => $path,
                'attachment_name' => $extension,
                'attachment_size' => $filesize,
            ]);

            new ApplicationFile($attachment_file);
        }
    }
}

Моя модель для файлов выглядит следующим образом:

class SingleApplicationFile extends Model {
    protected $table = "additional_files";

    protected $fillable = [
        'attachment', 'files_id', 'attachment_name', 
        'attachment_size', 'application_id'
    ];

    public function files()
    {
       return $this->belongsTo('App\Application');
    }
}

Затем она публикуется с JS:

var additional_files = [];

$("#form input[name='additional_files']").change(
    function() {
        additional_files = [];
        for (var i = 0; i < $(this)[0].files.length; i++) {
            additional_files.push($(this)[0].files[i]);
        }
    }
);

$('#form button[type="submit"]').click(function(e) {
    e.preventDefault();

    var formData = new FormData();

    formData.append(
        "name",
        $("#form")
            .find('input[name="name"]')
            .val()
    );
    formData.append(
        "email",
        $("#form")
            .find('input[name="email"]')
            .val()
    );

    formData.append(
        "phone",
        $("#form")
            .find('input[name="phone"]')
            .val()
    );

    if (additional_files.length > 0) {
        formData.append("additional_files", additional_files);
    }

        axios
            .post($("#form").attr("action"), formData)
            .then(response => {
              // some success message
              }
            })
            .catch(error => {
                console.log("ERR: ", error);
            });

 });

"Обычный"поля сохраняются, как и должны, но загруженные файлы не сохраняются, и когда я делаю dd($request()->all()), он возвращает:

additional_files: [object File], [object File] // for each file

Я понятия не имею, что я делаю неправильно.Я попытался добавить additional_files[] на входе -> <input type="file" name="additional_files[]" />, но безуспешно.

Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 24 сентября 2019

Вам не хватает отправить несколько файлов со страницы просмотра.Вы должны использовать [] в вашем типе ввода.

<input name="additional_files[]" type="file" multiple />

После этого только файлы будут загружены в виде массива.Тогда вы сможете пройти через массив, тогда вы сможете делать другие вещи.Дайте мне знать, если возникнут какие-либо проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...