首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件存储问题

文件存储问题
EN

Stack Overflow用户
提问于 2019-05-24 08:08:03
回答 2查看 702关注 0票数 1

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

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

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

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

代码语言:javascript
复制
<?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管理面板(联系人面包)文件夹创建新联系人时,上传的文件会进入public\contacts\month year- https://i.imgur.com/Q3GBom8.png (May2019)\,这也是我希望使用联系人表单执行的操作。https://i.imgur.com/bFKSKzq.png

有人能帮我解决这个问题吗?

PS:命令php artisan storage:link表明“公共/存储”目录已经存在。

此外,如果需要,我将显示任何文件内容

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-05-24 11:19:56

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

代码语言:javascript
复制
'contacts' => [
    'driver' => 'local',
    'root' => public_path('contacts'),
    'url' => env('APP_URL').'/contacts',
    'visibility' => 'public',
],

然后在您的控制器中更改行

代码语言:javascript
复制
$path = $request->file('fichier')->storeAs('contacts', $fileNameToStore);

代码语言:javascript
复制
Storage::disk('contacts')->putFileAs($monthYear, $request->file('fichier'), $filename)

当然,您必须计算$monthYear变量来计算子文件夹名。

票数 1
EN

Stack Overflow用户

发布于 2019-05-30 01:49:53

关于@莱昂纳多·罗西的评论,我已经通过将这个添加到我的config/filesystem.php中解决了这个问题

代码语言:javascript
复制
        'contacts' => [
        'driver' => 'local',
        'root' => storage_path('app/public/contacts'),
        'url' => '/contacts',
        'visibility' => 'public',
    ],

在控制器中,因为文件存储在正确的文件夹中,所以我尝试获取路径,然后将其存储在数据库字段(fichier)中,如下所示:

代码语言:javascript
复制
        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; 
    }

您还可以了解如何使用datetime元素(Month+Year)为我创建文件夹。

谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56284318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档