Files
core/app/Models/File.php
T
Michal Kváček df3bc22954 FEATURE #1508: merge files and directories overview.
This commit merges list of all uploaded files and created directories into one page. It also modifies way of uploading files. Special page for uploading files was removed (because of no support for directories) and files can be uploaded only via overview.
2016-03-13 22:50:20 +01:00

119 lines
3.4 KiB
PHP

<?php
namespace App\Models;
use App\Events\UploadFile;
use App\Http\Requests\UploadRequest;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event;
use Symfony\Component\HttpFoundation\File\File as SymphonyFile;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Class File
*/
class File extends Model
{
/**
* Hash algorithm used for hashing file
*/
const HASH_ALGORITHM = 'sha256';
/**
* @var bool $timstamps have created_at and updated_at fields
*/
public $timestamps = true;
protected $fillable = [
'filename',
'original_filename',
'description',
'keywords',
'directory'
];
protected $guarded = [];
/**
* 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 uniqid() . '.' . $file->getClientOriginalExtension();
}
/**
* Saves file into FS and creates new record in database
*
* @param UploadedFile $file
* @param UploadRequest $request
*
* @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, UploadRequest $request)
{
$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, $request, $file->getClientOriginalName());
// fire event about new file
Event::fire(new UploadFile($uploadedFile, $id));
return [
'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 UploadRequest $request
* @param $originalFilename
*
* @return mixed
*/
protected function saveIntoDatabase(SymphonyFile $file, UploadRequest $request, $originalFilename)
{
// get path and hash of uploaded file
$path = config('app.upload_path') . DIRECTORY_SEPARATOR . $file->getFilename();
$hash = hash_file(self::HASH_ALGORITHM, $path);
// define mandatory fields
$newFile = new File();
$newFile->user_id = Auth::user()->id;
$newFile->filename = $file->getFilename();
$newFile->original_filename = $originalFilename;
$newFile->file_hash = $hash;
$newFile->hash_algorithm = self::HASH_ALGORITHM;
$newFile->mime_type = $file->getMimeType();
$newFile->file_size = $file->getSize();
$newFile->directory_id = $request->directoryId;
// save optional fields
$optionalFields = ['description', 'keywords'];
foreach ($optionalFields as $field) {
if ($request->has($field)) {
$newFile->$field = $request->$field;
}
}
// create new database row
$newFile->save();
return $newFile->id;
}
}