【问题标题】:File storage issue文件存储问题
【发布时间】:2019-10-10 13:33:50
【问题描述】:

我最近开始使用 laravel voyager admin 包,我有一个关于文件上传机制的问题。

首先,我在媒体菜单“联系人”上创建了一个文件夹: https://i.imgur.com/fkaVqBz.png

之后,我制作了一个控制器来处理联系表,他们可以上传他们的简历: https://i.imgur.com/ckCCSOH.png

在我的 ContactController 中,我对上传的文件进行了一些验证,如果用户发送了 post 请求,我对上传文件的名称进行了一些修改:

<?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 文件已成功上传,但不在正确的目的地,并且正在 storage\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”目录已经存在。

另外,如果需要,我会显示任何文件内容

谢谢。

【问题讨论】:

  • 您尝试过使用 public_path 吗? ->storeAs(public_path('contacts'), $fileNameToStore);
  • @Dave: 先生您好,我试过了,我得到了这个错误:i.imgur.com/jdxPqh3.png

标签: php laravel laravel-5 laravel-5.7 voyager


【解决方案1】:

首先在config/filesystem.php文件的disks部分添加一个新条目

'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 变量来计算子文件夹名称。

【讨论】:

  • 您好先生,我已经尝试过您的解决方案,我现在可以将我的文件存储在 public/contacts/monthYear 文件夹中,但是问题出在 voyager 中,当单击添加的新联系人的文件字段时,文件应存储在 storage/contacts/ 中。这是我的新控制器:i.imgur.com/fYoPeSH.png,这是存储文件的位置:i.imgur.com/Ze9kGVV.png,我可以使用 localhost:8000/contacts/May2019/TEST_1558790898.pdf 访问我的文件。但在 voyager admin 中,它应该是 storage/contacts/...i.imgur.com/xiiGiQs.pngi.imgur.com/606zbzG.png。感谢您的帮助
  • 您应该将新磁盘的root参数更改为storage_path('contacts'),然后运行ln -sf ./storage/contacts ./public/contacts。在运行最后一个命令之前,请确保您拥有 contacts 目录
  • 抱歉,我不了解 Voyager,因此您应该检查它如何为文件创建链接并采取相应措施。
【解决方案2】:

关于@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; 
    }

对于我的案例,您还可以了解如何使用日期时间元素(月+年)创建文件夹。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2011-01-12
    • 1970-01-01
    • 2012-11-06
    • 2017-03-08
    • 2021-11-02
    • 2019-06-09
    相关资源
    最近更新 更多