Created
November 20, 2017 12:43
-
-
Save sourovroy/01adebb4890dd8ac1bbe089fe17940f9 to your computer and use it in GitHub Desktop.
Laravel upload file with unique file name
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers; | |
use Illuminate\Http\Request; | |
use Illuminate\Support\Facades\Storage; | |
class MediaController extends Controller | |
{ | |
/** | |
* Upload image | |
*/ | |
public function upload(Request $request) | |
{ | |
if($request->hasFile('media_file')){ | |
$theFile = $request->file('media_file'); | |
if($theFile->isValid()){ | |
$folder = 'images'; | |
$disk = Storage::disk('public'); | |
$uniqueFilename = $this->uniqueMediaName($theFile, $folder, $disk); | |
$path = $theFile->storeAs($folder, $uniqueFilename, 'public'); | |
$fileurl = $disk->url($path); | |
return response()->json(['fileurl' => $fileurl], 201); | |
}else{ | |
return response()->json(['error' => 'No file uploaded'], 400); | |
} | |
}else{ | |
return response()->json(['error' => 'No file'], 400); | |
} | |
}// upload | |
/** | |
* Generate unique file name | |
*/ | |
public function uniqueMediaName($theFile, $folder, $disk) | |
{ | |
$filename = $theFile->getClientOriginalName(); | |
$extension = $theFile->getClientOriginalExtension(); | |
$i = 1; | |
$basename = basename($filename, '.' . $extension); | |
$output = $folder.'/'.$filename; | |
while($disk->exists($output)){ | |
$output = $folder .'/'. $basename .'-'. $i . '.' . $extension; | |
$i++; | |
} | |
return basename($output); | |
}//uniqueMediaName | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<template> | |
<div class="container"> | |
<div class="card"> | |
<header class="card-header"> | |
<p class="card-header-title"> | |
File Picker | |
</p> | |
</header> | |
<div class="card-content"> | |
<div> | |
<div v-if="getDropItem"> | |
<!-- Image List will be here --> | |
</div> | |
<div v-else> | |
<div @dragenter="highlightDropzone = true" | |
:class="{'highlight-dropzone': highlightDropzone}" | |
@dragleave="highlightDropzone = false" | |
@dragover.prevent | |
@drop.prevent="dropMethod($event)" class="file-dragzone"> | |
<p>Drop your file here to upload.</p> | |
</div> | |
</div> | |
</div> | |
</div> <!-- /.card-content --> | |
</div> | |
</div> | |
</template> | |
<script> | |
export default { | |
data: () => ({ | |
highlightDropzone: false, | |
getDropItem: false, | |
dragged: null | |
}), | |
methods: { | |
dropMethod(event){ | |
this.highlightDropzone = false; | |
this.getDropItem = true; | |
var dt = event.dataTransfer; | |
if(dt.files.length){ | |
var dropItems = dt.files; | |
for(var i=0; i < dropItems.length; i++){ | |
let form = new FormData(); | |
form.append('media_file', dropItems[i]); | |
axios.post('/upload', form).then(function(reseponse){ | |
console.log(reseponse); | |
}).catch(function(error){ | |
console.log(error); | |
}); | |
}// End for | |
}// End if | |
} // dropMethod | |
}// methods | |
} | |
</script> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// We must use post request | |
Route::post('/upload', 'MediaController@upload'); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment