我最近开始使用laravel voyager管理包,我有一个关于文件上传机制的问题。
首先,我在媒体菜单“联系人”上创建了一个文件夹: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文件已成功上载,但目标位置不正确,并在存储\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表明“公共/存储”目录已经存在。
此外,如果需要,我将显示任何文件内容
谢谢。
发布于 2019-05-24 11:19:56
首先在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变量来计算子文件夹名。
发布于 2019-05-30 01:49:53
关于@莱昂纳多·罗西的评论,我已经通过将这个添加到我的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;
}您还可以了解如何使用datetime元素(Month+Year)为我创建文件夹。
谢谢。
https://stackoverflow.com/questions/56284318
复制相似问题