Проблема с хранением файлов - PullRequest
1 голос
/ 24 мая 2019

Я недавно начал работать с пакетом администрирования 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 успешно загружен, но не в нужном месте назначения, а папка контактов создается в хранилище \ app:https://i.imgur.com/YPpzfCD.png https://i.imgur.com/KV2CNXo.png

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

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

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

Также,Я покажу любое содержимое файла при необходимости

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Сначала добавьте новую запись в 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);

до

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

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

0 голосов
/ 29 мая 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; 
    }

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

Спасибо.

...