FEATURE #1337: add file upload

This commit registers new items into admin menu and adds functionality for uploading files.
This commit is contained in:
Michal Kváček
2016-02-08 14:27:43 +01:00
parent 58a3386277
commit 24144f6aa4
19 changed files with 489 additions and 53 deletions
+103 -6
View File
@@ -2,24 +2,121 @@
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 = [
'user_id',
'filename',
'sha256_hash',
'mime_type'
'original_filename',
'file_hash',
'hash_algorithm',
'mime_type',
'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
$params = [
'user_id' => Auth::user()->id,
'filename' => $file->getFilename(),
'original_filename' => $originalFilename,
'file_hash' => $hash,
'hash_algorithm' => self::HASH_ALGORITHM,
'mime_type' => $file->getMimeType(),
];
// save optional fields
$optionalFields = ['description', 'keywords', 'directory'];
foreach ($optionalFields as $field) {
if ($request->has($field)) {
$params[$field] = $request->$field;
}
}
// create new database row
$newFile = File::create($params);
return $newFile->id;
}
}