Проблема с файловым хранилищем

Недавно я начал работать с административным пакетом laravel voyager, и у меня возникла проблема с механизмом загрузки файлов.

Во-первых, я создал папку в медиа-меню «Контакты»: https://i.imgur.com/fkaVqBz.png

После этого я сделал контроллер для работы с контактной формой, с помощью которого они могут загружать свои биографические данные: https://i.imgur.com/ckCCSOH.png

В моем ContactController я сделал некоторые проверки загруженного файла и некоторые изменения в имени загруженного файла, если пользователь отправляет почтовый запрос:

<?php

namespace App\Http\Controllers;

use App\Contact;
use Illuminate\Http\Request;
use App\Rules\Captcha;

class ContactController extends Controller
{
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function PostContact(Request $request) {
        //
        $this->validate($request, [
            'nom' => 'required|min:2|max:50',
            'prenom' => 'required|min:2|max:50',
            'email' => 'required|email',
            'organisme' => 'required',
            'fonction' => 'required',
            'pays' => 'required',
            'ville' => 'required',
            'telephone' => 'required|numeric|',
            'objet' => 'required',
            'fichier' => 'sometimes|nullable|mimes:doc,docx,pdf',
            'g-recaptcha-response' => new Captcha(),
            'message' => 'required|min:10']);

        $contact = new Contact;

        $contact->nom = $request->input('nom');
        $contact->prenom = $request->input('prenom');
        $contact->organisme = $request->input('organisme');
        $contact->fonction = $request->input('fonction');
        $contact->pays = $request->input('pays');
        $contact->ville = $request->input('ville');     
        $contact->email = $request->input('email');
        $contact->telephone = $request->input('telephone');
        $contact->objet = $request->objet;

        if ($request->hasFile('fichier')) {

            $filenameWithExt = $request->file('fichier')->getClientOriginalName();

            $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);

            $extension = $request->file('fichier')->getClientOriginalExtension();

            $fileNameToStore = $filename.'_'.time().'.'.$extension;

            $path = $request->file('fichier')->storeAs('contacts', $fileNameToStore);

            $contact->fichier = $path;
        }

        $contact->message = $request->input('message');

        $contact->save();

        return redirect('contact')->with('status', 'Votre message a été envoyé avec succès !!');
    }
}

Файл CV успешно загружен, но не в нужном месте, а папка с контактами создается в хранилище\приложении: https://i.imgur.com/YPpzfCD.png https://i.imgur.com/KV2CNXo.png

Когда я создаю новый контакт через панель администратора voyager (контактный хлеб) https://i.imgur.com/Q3GBom8.png, загруженный файл помещается в общедоступную папку\контакты\месяц-год-папка (май 2019 г.)\, и это то, что я надеюсь сделать также с помощью моей контактной формы. https://i.imgur.com/bFKSKzq.png

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

PS: команда php artisan storage:link указывает, что каталог "public/storage" уже существует.

Кроме того, я покажу любое содержимое файла, если это необходимо

Спасибо.


person Rachid Azzanati    schedule 24.05.2019    source источник
comment
Вы пытались использовать public_path? -›storeAs(public_path('contacts'), $fileNameToStore);   -  person Dave    schedule 24.05.2019
comment
@Dave: Здравствуйте, сэр, я попробовал и получил эту ошибку: i.imgur.com/jdxPqh3 .png   -  person Rachid Azzanati    schedule 24.05.2019


Ответы (2)


Сначала добавьте новую запись в раздел disks файла config/filesystem.php.

'contacts' => [
    'driver' => 'local',
    'root' => public_path('contacts'),
    'url' => env('APP_URL').'/contacts',
    'visibility' => 'public',
],

Затем в вашем контроллере измените строку

$path = $request->file('fichier')->storeAs('contacts', $fileNameToStore);

to

Storage::disk('contacts')->putFileAs($monthYear, $request->file('fichier'), $filename)

Конечно, вам нужно вычислить переменную $monthYear, чтобы вычислить имя подпапки.

person Leonardo Rossi    schedule 24.05.2019
comment
Здравствуйте, сэр, я попробовал ваше решение, теперь я могу хранить свой файл в папке public/contacts/monthYear, но проблема в voyager, при нажатии на поле файла для добавления нового контакта файл должен храниться в хранилище/контактах /. Это мой новый контроллер: i.imgur.com/fYoPeSH.png, здесь файл хранится: i.imgur.com/Ze9kGVV.png, я могу получить доступ к своим файлам с localhost:8000/contacts/May2019/TEST_1558790898.pdf . но в админке voyager это должно быть storage/contacts/... i.imgur.com/xiiGiQs.png , i.imgur.com/606zbzG.png. Спасибо за вашу помощь - person Rachid Azzanati; 25.05.2019
comment
Вы должны изменить параметр root вашего нового диска на storage_path('contacts'), а затем запустить ln -sf ./storage/contacts ./public/contacts. Перед выполнением этой последней команды убедитесь, что у вас есть каталог contacts. - person Leonardo Rossi; 25.05.2019
comment
Извините, я не знаком с Voyager, поэтому вам следует проверить, как он создает ссылки для файла, и действовать соответствующим образом. - person Leonardo Rossi; 26.05.2019

Что касается комментария @Leonardo Rossi, я решил эту проблему, добавив это в свой config/filesystem.php:

        'contacts' => [
        'driver' => 'local',
        'root' => storage_path('app/public/contacts'),
        'url' => '/contacts',
        'visibility' => 'public',
    ],

и в контроллере, поскольку файл был сохранен в правильной папке, я попытался получить путь, а затем сохранить его в поле базы данных (fichier) следующим образом:

        if ($request->hasFile('fichier')) {

        $filenameWithExt = $request->file('fichier')->getClientOriginalName();

        $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);

        $extension = $request->file('fichier')->getClientOriginalExtension();

        $fileNameToStore = $filename.'_'.time().'.'.$extension;

        /* $path = $request->file('fichier')->storeAs(public_path('contacts'), $fileNameToStore); */
        $now = new \DateTime('now'); //Datetime
        $monthNum = $now->format('m');
        $dateObj   = DateTime::createFromFormat('!m', $monthNum);
        $monthName = $dateObj->format('F'); // Month
        $year = $now->format('Y'); // Year

        $monthYear = $monthName.$year;

        Storage::disk('contacts')->putFileAs($monthYear, $request->file('fichier'), $fileNameToStore);

        $path = Storage::disk('contacts')->url($monthYear.'/'.$fileNameToStore);

        $contact->fichier = $path; 
    }

Вы также можете иметь представление о том, как вы можете создать папку, используя элементы даты и времени (месяц + год) для моего случая.

Спасибо.

person Rachid Azzanati    schedule 29.05.2019