Skip to content

Commit 4739239

Browse files
committed
Refactor FileController and File Model. Fix bug with src in editing file name
1 parent 2036cb0 commit 4739239

File tree

5 files changed

+116
-70
lines changed

5 files changed

+116
-70
lines changed

app/File.php

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,99 @@
33
namespace App;
44

55
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Support\Facades\Storage;
7+
use Auth;
68

79
class File extends Model
810
{
9-
1011
protected $fillable = [
1112
'name', 'type', 'extension', 'user_id'
1213
];
1314

15+
public static $image_ext = ['jpg', 'jpeg', 'png', 'gif'];
16+
public static $audio_ext = ['mp3', 'ogg', 'mpga'];
17+
public static $video_ext = ['mp4', 'mpeg'];
18+
public static $document_ext = ['doc', 'docx', 'pdf', 'odt'];
19+
20+
/**
21+
* Get maximum file size
22+
* @return int maximum file size in kilobites
23+
*/
24+
public static function getMaxSize()
25+
{
26+
return (int)ini_get('upload_max_filesize') * 1000;
27+
}
28+
29+
/**
30+
* Get directory for the specific user
31+
* @return string Specific user directory
32+
*/
33+
public function getUserDir()
34+
{
35+
return Auth::user()->name . '_' . Auth::id();
36+
}
37+
38+
/**
39+
* Get all extensions
40+
* @return array Extensions of all file types
41+
*/
42+
public static function getAllExtensions()
43+
{
44+
$merged_arr = array_merge(self::$image_ext, self::$audio_ext, self::$video_ext, self::$document_ext);
45+
return implode(',', $merged_arr);
46+
}
47+
48+
/**
49+
* Get type by extension
50+
* @param string $ext Specific extension
51+
* @return string Type
52+
*/
53+
public function getType($ext)
54+
{
55+
if (in_array($ext, self::$image_ext)) {
56+
return 'image';
57+
}
58+
59+
if (in_array($ext, self::$audio_ext)) {
60+
return 'audio';
61+
}
62+
63+
if (in_array($ext, self::$video_ext)) {
64+
return 'video';
65+
}
66+
67+
if (in_array($ext, self::$document_ext)) {
68+
return 'document';
69+
}
70+
}
71+
72+
/**
73+
* Get file name and path to the file
74+
* @param string $type File type
75+
* @param string $name File name
76+
* @param string $extension File extension
77+
* @return string File name with the path
78+
*/
79+
public function getName($type, $name, $extension)
80+
{
81+
return '/public/' . $this->getUserDir() . '/' . $type . '/' . $name . '.' . $extension;
82+
}
83+
84+
/**
85+
* Upload file to the server
86+
* @param string $type File type
87+
* @param object $file Uploaded file from request
88+
* @param string $name File name
89+
* @param string $extension File extension
90+
* @return boolean True if file successfully uploaded, otherwise - false
91+
*/
92+
public function upload($type, $file, $name, $extension)
93+
{
94+
$path = '/public/' . $this->getUserDir() . '/' . $type . '/';
95+
$full_name = $name . '.' . $extension;
96+
97+
return Storage::putFileAs($path, $file, $full_name);
98+
}
1499

15100
public function user()
16101
{

app/Http/Controllers/FileController.php

Lines changed: 12 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@
1010

1111
class FileController extends Controller
1212
{
13-
private $image_ext = ['jpg', 'jpeg', 'png', 'gif'];
14-
private $audio_ext = ['mp3', 'ogg', 'mpga'];
15-
private $video_ext = ['mp4', 'mpeg'];
16-
private $document_ext = ['doc', 'docx', 'pdf', 'odt'];
17-
1813
/**
1914
* Constructor
2015
*/
@@ -65,25 +60,22 @@ public function index($type, $id = null)
6560
*/
6661
public function store(Request $request)
6762
{
68-
$max_size = (int)ini_get('upload_max_filesize') * 1000;
69-
$all_ext = implode(',', $this->allExtensions());
70-
7163
$this->validate($request, [
7264
'name' => 'required|unique:files',
73-
'file' => 'required|file|mimes:' . $all_ext . '|max:' . $max_size
65+
'file' => 'required|file|mimes:' . File::getAllExtensions() . '|max:' . File::getMaxSize()
7466
]);
7567

76-
$model = new File();
68+
$file = new File();
7769

78-
$file = $request->file('file');
79-
$ext = $file->getClientOriginalExtension();
80-
$type = $this->getType($ext);
70+
$uploaded_file = $request->file('file');
71+
$original_ext = $uploaded_file->getClientOriginalExtension();
72+
$type = $file->getType($original_ext);
8173

82-
if (Storage::putFileAs('/public/' . $this->getUserDir() . '/' . $type . '/', $file, $request['name'] . '.' . $ext)) {
83-
return $model::create([
74+
if ($file->upload($type, $uploaded_file, $request['name'], $original_ext)) {
75+
return $file::create([
8476
'name' => $request['name'],
8577
'type' => $type,
86-
'extension' => $ext,
78+
'extension' => $original_ext,
8779
'user_id' => Auth::id()
8880
]);
8981
}
@@ -109,8 +101,8 @@ public function edit($id, Request $request)
109101
'name' => 'required|unique:files'
110102
]);
111103

112-
$old_filename = '/public/' . $this->getUserDir() . '/' . $file->type . '/' . $file->name . '.' . $file->extension;
113-
$new_filename = '/public/' . $this->getUserDir() . '/' . $request['type'] . '/' . $request['name'] . '.' . $request['extension'];
104+
$old_filename = $file->getName($file->type, $file->name, $file->extension);
105+
$new_filename = $file->getName($request['type'], $request['name'], $request['extension']);
114106

115107
if (Storage::disk('local')->exists($old_filename)) {
116108
if (Storage::disk('local')->move($old_filename, $new_filename)) {
@@ -132,55 +124,13 @@ public function destroy($id)
132124
{
133125
$file = File::findOrFail($id);
134126

135-
if (Storage::disk('local')->exists('/public/' . $this->getUserDir() . '/' . $file->type . '/' . $file->name . '.' . $file->extension)) {
136-
if (Storage::disk('local')->delete('/public/' . $this->getUserDir() . '/' . $file->type . '/' . $file->name . '.' . $file->extension)) {
127+
if (Storage::disk('local')->exists($file->getName($file->type, $file->name, $file->extension))) {
128+
if (Storage::disk('local')->delete($file->getName($file->type, $file->name, $file->extension))) {
137129
return response()->json($file->delete());
138130
}
139131
}
140132

141133
return response()->json(false);
142134
}
143135

144-
145-
/**
146-
* Get type by extension
147-
* @param string $ext Specific extension
148-
* @return string Type
149-
*/
150-
private function getType($ext)
151-
{
152-
if (in_array($ext, $this->image_ext)) {
153-
return 'image';
154-
}
155-
156-
if (in_array($ext, $this->audio_ext)) {
157-
return 'audio';
158-
}
159-
160-
if (in_array($ext, $this->video_ext)) {
161-
return 'video';
162-
}
163-
164-
if (in_array($ext, $this->document_ext)) {
165-
return 'document';
166-
}
167-
}
168-
169-
/**
170-
* Get all extensions
171-
* @return array Extensions of all file types
172-
*/
173-
private function allExtensions()
174-
{
175-
return array_merge($this->image_ext, $this->audio_ext, $this->video_ext, $this->document_ext);
176-
}
177-
178-
/**
179-
* Get directory for the specific user
180-
* @return string Specific user directory
181-
*/
182-
private function getUserDir()
183-
{
184-
return Auth::user()->name . '_' . Auth::id();
185-
}
186136
}

app/Http/Middleware/RedirectIfAuthenticated.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class RedirectIfAuthenticated
1818
public function handle($request, Closure $next, $guard = null)
1919
{
2020
if (Auth::guard($guard)->check()) {
21-
return redirect('/home');
21+
return redirect(route('home'));
2222
}
2323

2424
return $next($request);

resources/assets/js/app.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ const app = new Vue({
5050

5151
editingFile: {},
5252
deletingFile: {},
53+
savedFile: {
54+
type: '',
55+
name: '',
56+
extension: ''
57+
},
5358

5459
notification: false,
5560
showConfirm: false,
@@ -76,6 +81,7 @@ const app = new Vue({
7681
axios.get('files/' + type + '?page=' + page).then(result => {
7782
this.loading = false;
7883
this.files = result.data.data.data;
84+
console.log(this.files);
7985
this.pagination = result.data.pagination;
8086
}).catch(error => {
8187
console.log(error);
@@ -144,6 +150,9 @@ const app = new Vue({
144150

145151
editFile(file) {
146152
this.editingFile = file;
153+
this.savedFile.type = file.type;
154+
this.savedFile.name = file.name;
155+
this.savedFile.extension = file.extension;
147156
},
148157

149158
endEditing(file) {
@@ -158,17 +167,18 @@ const app = new Vue({
158167
.then(response => {
159168
if (response.data === true) {
160169
this.showNotification('Filename successfully changed!', true);
161-
162170
var src = document.querySelector('[alt="' + file.name +'"]').getAttribute("src");
163171
document.querySelector('[alt="' + file.name +'"]').setAttribute('src', src);
164172
}
173+
this.fetchFile(this.activeTab, this.pagination.current_page);
174+
165175
})
166176
.catch(error => {
177+
console.log(error);
167178
this.errors = error.response.data.errors;
168179
this.showNotification(error.response.data.message, false);
180+
this.fetchFile(this.activeTab, this.pagination.current_page);
169181
});
170-
171-
this.fetchFile(this.activeTab, this.pagination.current_page);
172182
},
173183

174184
showNotification(text, success) {

resources/views/main.blade.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,14 @@
4949
<i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i>
5050
<span class="sr-only">Loading...</span>
5151
</div>
52-
53-
<div class="column " :class="isVideo ? 'is-half' : 'is-one-fifth'" v-for="file in files" v-cloak>
52+
<br>
53+
<div class="column " :class="isVideo ? 'is-half' : 'is-one-fifth'" v-for="file in files" >
5454
<div class="card " :class="file.type == 'image' ? 'is-image' : ''">
5555
<div class="card-image">
5656
<button class="delete delete-file" title="Delete" @click="prepareToDelete(file)"></button>
5757
<figure class="image is-4by3" v-if="file.type == 'image'" @click="showModal(file)">
58-
<img src="" :src="'{{ asset('storage/' . Auth::user()->name . '_' . Auth::id()) }}' + '/' + file.type + '/' + file.name + '.' + file.extension" :alt="file.name">
58+
<img v-if="file === editingFile" src="" :src="'{{ asset('storage/' . Auth::user()->name . '_' . Auth::id()) }}' + '/' + savedFile.type + '/' + savedFile.name + '.' + savedFile.extension" :alt="file.name">
59+
<img v-if="file !== editingFile" src="" :src="'{{ asset('storage/' . Auth::user()->name . '_' . Auth::id()) }}' + '/' + file.type + '/' + file.name + '.' + file.extension" :alt="file.name">
5960
</figure>
6061

6162
<div v-if="file.type == 'audio'">

0 commit comments

Comments
 (0)