Skip to content

Commit 71b852b

Browse files
committed
initial-commit
0 parents  commit 71b852b

File tree

9 files changed

+554
-0
lines changed

9 files changed

+554
-0
lines changed

composer.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"name": "oldravian/multi-source-file-uploader",
3+
"description": "A Laravel package for handling file upload from multiple sources like HTML form, file url or base64 encoded file",
4+
"keywords": [
5+
"laravel",
6+
"file-upload",
7+
"multi-source-file-upload",
8+
"upload-file-from-url",
9+
"upload-file-from-base64"
10+
],
11+
"type": "library",
12+
"license": "MIT",
13+
"authors": [
14+
{
15+
"name": "Habib urRehman",
16+
"email": "chaudryhabib2@gmail.com"
17+
}
18+
],
19+
"minimum-stability": "dev",
20+
"prefer-stable": true,
21+
"require": {
22+
"php": "^7.1.3"
23+
},
24+
"autoload": {
25+
"psr-4": {
26+
"OldRavian\\FileUploader\\": "src/"
27+
}
28+
},
29+
"extra": {
30+
"laravel": {
31+
"providers": [
32+
"OldRavian\\FileUploader\\FileUploaderServiceProvider"
33+
]
34+
}
35+
},
36+
"repositories": [
37+
{
38+
"type": "vcs",
39+
"url": ""
40+
}
41+
]
42+
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
<?php
2+
/**
3+
* Author: Habib urRehman
4+
* Email : chaudryhabib2@gmail.com
5+
*/
6+
namespace OldRavian\FileUploader\Abstracts;
7+
8+
use OldRavian\FileUploader\Contracts\FileUploaderContract;
9+
use Illuminate\Http\UploadedFile;
10+
abstract class AbstractFileUploader implements FileUploaderContract
11+
{
12+
/**
13+
* @var $uploadError
14+
*/
15+
public $uploadError;
16+
17+
/**
18+
* Default settings
19+
*
20+
*/
21+
protected $settings;
22+
23+
public function __construct()
24+
{
25+
$this->initializeDefaults();
26+
}
27+
28+
/**
29+
* Initialize default settings
30+
*
31+
* @return void
32+
*/
33+
protected function initializeDefaults()
34+
{
35+
$this->settings = config('old-ravian-file-uploader');
36+
}
37+
38+
/**
39+
* Handle the uploaded file
40+
*
41+
* @param Illuminate\Http\UploadedFile|string $target
42+
* @param array $settings
43+
*
44+
* @return array|false
45+
*/
46+
public function upload($target, array $settings = [])
47+
{
48+
$settings = array_merge($this->settings, $settings);
49+
50+
if ($this->uploadValidate($target, $settings)) {
51+
return $this->storeFile($target, $settings);
52+
}
53+
54+
return false;
55+
}
56+
57+
/**
58+
* @param Illuminate\Http\UploadedFile|string $target
59+
* @param array $settings
60+
* @return array|false
61+
*/
62+
public function uploadMany(array $targets, array $settings = []){
63+
$arrs=[];
64+
foreach($targets as $target){
65+
$res = $this->upload($target, $settings);
66+
if($res===false){
67+
return false;
68+
}
69+
$arrs[] = $res;
70+
}
71+
return $arrs;
72+
}
73+
74+
/**
75+
* Validate the uploaded file for extension & size
76+
*
77+
* @return bool
78+
*/
79+
protected function uploadValidate(UploadedFile|string $uploadedFile, $settings){
80+
if (!$this->isValid($uploadedFile)) {
81+
return false;
82+
}
83+
84+
if (!in_array($this->getExtension($uploadedFile), $settings['allowed_extensions'])) {
85+
$this->uploadError = "Extension {$this->getExtension($uploadedFile)} is not allowed";
86+
return false;
87+
}
88+
89+
if ($this->getFileSize($uploadedFile) > $settings['max_file_size']) {
90+
$this->uploadError = "Input file cannot exceed {$settings['max_file_size']} bytes";
91+
return false;
92+
}
93+
94+
return true;
95+
}
96+
97+
protected function isValid(UploadedFile|string $uploadedFile){
98+
return true;
99+
}
100+
101+
/**
102+
* Return the file extension as extracted from the origin file name
103+
*
104+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
105+
*
106+
* @return string
107+
*/
108+
abstract protected function getExtension(UploadedFile|string $uploadedFile);
109+
110+
/**
111+
* Return the file size
112+
*
113+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
114+
*
115+
* @return double
116+
*/
117+
abstract protected function getFileSize(UploadedFile|string $uploadedFile);
118+
119+
/**
120+
* Generate an unique name for storing file
121+
*
122+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
123+
*
124+
* @return string
125+
*/
126+
protected function getUniqueName(UploadedFile|string $uploadedFile){
127+
$originName = $this->getOriginName($uploadedFile);
128+
$uniqueString = uniqid(rand(), true)."_".$originName."_".getmypid()."_".gethostname()."_".time();
129+
return md5($uniqueString).".".$this->getExtension($uploadedFile);
130+
}
131+
132+
/**
133+
* Return the original filename
134+
*
135+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
136+
*
137+
* @return string
138+
*/
139+
protected function getOriginName(UploadedFile|string $uploadedFile){
140+
return "".$this->getExtension($uploadedFile);
141+
}
142+
143+
144+
/**
145+
* Physically store the uploaded file
146+
*
147+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
148+
* @param array $settings
149+
*
150+
* @return array
151+
*/
152+
abstract protected function storeFile(UploadedFile|string $uploadedFile, $settings);
153+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
return [
4+
'disk' => env('OLDRAVIAN_File_UPLOADER_DISK', 'public'),
5+
'directory' => env('OLDRAVIAN_File_UPLOADER_DIRECTORY', 'media'),
6+
'max_file_size' => env('OLDRAVIAN_File_UPLOADER_MAX_FILE_SIZE', 52428800), // 50 MB
7+
'allowed_extensions' => [
8+
'png','jpg','jpeg','mp4','doc','docx','ppt','pptx','xls','xlsx','txt','pdf'
9+
],
10+
];
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
/**
3+
* Author: Habib urRehman
4+
* Email : chaudryhabib2@gmail.com
5+
*/
6+
namespace OldRavian\FileUploader\Contracts;
7+
8+
interface FileUploaderContract
9+
{
10+
public function upload($target, array $settings = []);
11+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
/**
3+
* Author: Habib urRehman
4+
* Email : chaudryhabib2@gmail.com
5+
*/
6+
namespace OldRavian\FileUploader\Factories;
7+
8+
use OldRavian\FileUploader\Services\ByForm;
9+
use OldRavian\FileUploader\Services\ByUrl;
10+
use OldRavian\FileUploader\Services\ByBase64;
11+
use Exception;
12+
13+
/**
14+
* Factory Pattern Implementation
15+
*/
16+
class FileUploaderFactory {
17+
18+
public function build($type){
19+
switch($type){
20+
case "form":
21+
return new ByForm;
22+
break;
23+
case "url":
24+
return new ByUrl;
25+
break;
26+
case "base64":
27+
return new ByBase64;
28+
break;
29+
default:
30+
throw new Exception("Unsupported source");
31+
break;
32+
}
33+
}
34+
35+
}
36+
37+
?>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
/**
3+
* Author: Habib urRehman
4+
* Email : chaudryhabib2@gmail.com
5+
*/
6+
namespace OldRavian\FileUploader;
7+
8+
use Illuminate\Support\ServiceProvider;
9+
10+
class FileUploaderServiceProvider extends ServiceProvider
11+
{
12+
/**
13+
* Bootstrap the application services.
14+
*
15+
* @return void
16+
*/
17+
public function boot()
18+
{
19+
$this->publishes([
20+
__DIR__.'/Config/old-ravian-file-uploader.php' => config_path('old-ravian-file-uploader.php'),
21+
]);
22+
}
23+
24+
/**
25+
* Register the application services.
26+
*
27+
* @return void
28+
*/
29+
public function register()
30+
{
31+
$this->mergeConfigFrom(__DIR__.'/Config/old-ravian-file-uploader.php', 'old-ravian-file-uploader');
32+
}
33+
}

src/Services/ByBase64.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
/**
3+
* Author: Habib urRehman
4+
* Email : chaudryhabib2@gmail.com
5+
*/
6+
namespace OldRavian\FileUploader\Services;
7+
8+
use OldRavian\FileUploader\Abstracts\AbstractFileUploader;
9+
use Illuminate\Support\Facades\Storage;
10+
use Illuminate\Http\UploadedFile;
11+
12+
class ByBase64 extends AbstractFileUploader
13+
{
14+
private $base64Arr;
15+
16+
protected function isValid(UploadedFile|string $uploadedFile){
17+
// split the string on commas
18+
//$data[ 0 ] == "data:image/png;base64"
19+
//$data[ 1 ] == <actual base64 string>
20+
$this->base64Arr = explode( ',', $uploadedFile );
21+
if (count($this->base64Arr)<2) {
22+
$this->uploadError = "Unable to upload file from base64";
23+
return false;
24+
}
25+
return true;
26+
}
27+
28+
/**
29+
* Return the file extension as extracted from the origin file name
30+
*
31+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
32+
*
33+
* @return string
34+
*/
35+
protected function getExtension(UploadedFile|string $uploadedFile){
36+
$ext = substr($this->base64Arr[0], strpos($this->base64Arr[0], '/')+1);
37+
$ext = substr($ext, 0, strpos($ext, ';'));
38+
return $ext;
39+
}
40+
41+
/**
42+
* Return the file size
43+
*
44+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
45+
*
46+
* @return double
47+
*/
48+
protected function getFileSize(UploadedFile|string $uploadedFile)
49+
{
50+
//https://stackoverflow.com/a/5373559/10029265
51+
return strlen(base64_decode($uploadedFile));
52+
}
53+
54+
/**
55+
* Physically store the uploaded file
56+
*
57+
* @param Illuminate\Http\UploadedFile|string $uploadedFile
58+
* @param array $settings
59+
*
60+
* @return array
61+
*/
62+
protected function storeFile(UploadedFile|string $uploadedFile, $settings)
63+
{
64+
$name = $this->getUniqueName($uploadedFile);
65+
$storeLocation = $settings['directory'].DIRECTORY_SEPARATOR.$name;
66+
Storage::disk($settings['disk'])->put($storeLocation, base64_decode( $this->base64Arr[1] ));
67+
68+
$url = Storage::disk($settings['disk'])->url($storeLocation);
69+
70+
return [
71+
'filename' => $name,
72+
'path' => $storeLocation,
73+
'url' => $url,
74+
];
75+
}
76+
}

0 commit comments

Comments
 (0)