94 lines
3.4 KiB
PHP
94 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Models\FileManager\ModelTraits;
|
|
|
|
use App\Events\UploadFile;
|
|
use App\Models\FileManager\File as FileModel;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Event;
|
|
use Symfony\Component\HttpFoundation\File\File as SymphonyFile;
|
|
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
|
|
|
trait File
|
|
{
|
|
/**
|
|
* Getter for filename of uploaded file.
|
|
*
|
|
* This filename is used for localy stored file.
|
|
*
|
|
* @param UploadedFile $file
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getFilename(UploadedFile $file)
|
|
{
|
|
return date('Y-m-').uniqid() . '.' . $file->getClientOriginalExtension();
|
|
}
|
|
|
|
/**
|
|
* Saves file into FS and creates new record in database
|
|
*
|
|
* @param UploadedFile $file
|
|
* @param $data
|
|
*
|
|
* @return array associative array - key 'file' is type of SymphonyFile and contains info about real file, key 'id'
|
|
* is ID of row in files table
|
|
*/
|
|
public function upload(UploadedFile $file, $data = [])
|
|
{
|
|
$data = (object)$data;
|
|
|
|
$destination = config('app.upload_path');
|
|
$filename = $this->getFilename($file);
|
|
|
|
// save file into physical location (local FS)
|
|
$uploadedFile = $file->move($destination, $filename);
|
|
|
|
// insert record into database
|
|
$id = $this->saveIntoDatabase($uploadedFile, $data, $file->getClientOriginalName());
|
|
|
|
// fire event about new file
|
|
Event::fire(new UploadFile($uploadedFile, $id));
|
|
|
|
return [
|
|
'filename' => $filename,
|
|
'file' => $file,
|
|
'id' => $id
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Save file into database
|
|
*
|
|
* This file saves new record into database. It also calculates hash of given file, obtains MIME type etc.
|
|
*
|
|
* @param SymphonyFile $file
|
|
* @param $request
|
|
* @param $originalFilename
|
|
*
|
|
* @return mixed
|
|
*/
|
|
protected function saveIntoDatabase(SymphonyFile $file, $request, $originalFilename)
|
|
{
|
|
// get path and hash of uploaded file
|
|
$path = config('app.upload_path') . DIRECTORY_SEPARATOR . $file->getFilename();
|
|
$hash = hash_file(FileModel::HASH_ALGORITHM, $path);
|
|
|
|
// define mandatory fields
|
|
$newFile = FileModel::create([
|
|
'user_id' => Auth::user()->id,
|
|
'filename' => $file->getFilename(),
|
|
'original_filename' => $originalFilename,
|
|
'file_hash' => $hash,
|
|
'hash_algorithm' => FileModel::HASH_ALGORITHM,
|
|
'mime_type' => $file->getMimeType(),
|
|
'file_size' => $file->getSize(),
|
|
'name' => isset($request->name) ? $request->name : '',
|
|
'description' => isset($request->description) ? $request->description : '',
|
|
'directory_id' => isset($request->directoryId) ? $request->directoryId ? $request->directoryId : null : null,
|
|
'keywords' => isset($request->keyword) ? $request->keyword : ''
|
|
]);
|
|
|
|
return $newFile->id;
|
|
}
|
|
} |