pixelfed/app/Http/Controllers/AvatarController.php

101 wiersze
3.1 KiB
PHP
Czysty Zwykły widok Historia

2018-06-01 02:36:58 +00:00
<?php
namespace App\Http\Controllers;
2018-08-10 09:10:05 +00:00
use App\Avatar;
use App\Jobs\AvatarPipeline\AvatarOptimize;
2018-08-28 03:07:36 +00:00
use Auth;
use Cache;
use Illuminate\Http\Request;
use Storage;
2018-06-01 02:36:58 +00:00
class AvatarController extends Controller
{
2018-08-10 09:10:05 +00:00
public function __construct()
{
return $this->middleware('auth');
}
public function store(Request $request)
{
$this->validate($request, [
'avatar' => 'required|mimes:jpeg,png|max:'.config('pixelfed.max_avatar_size'),
2018-08-10 09:10:05 +00:00
]);
2018-08-28 03:07:36 +00:00
2018-08-10 09:10:05 +00:00
try {
2018-08-28 03:07:36 +00:00
$user = Auth::user();
$profile = $user->profile;
$file = $request->file('avatar');
$path = $this->getPath($user, $file);
$dir = $path['root'];
$name = $path['name'];
$public = $path['storage'];
$currentAvatar = storage_path('app/'.$profile->avatar->media_path);
$loc = $request->file('avatar')->storeAs($public, $name);
2018-08-10 09:10:05 +00:00
2018-08-28 03:07:36 +00:00
$avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
$opath = $avatar->media_path;
$avatar->media_path = "$public/$name";
$avatar->thumb_path = null;
$avatar->change_count = ++$avatar->change_count;
$avatar->last_processed_at = null;
$avatar->save();
2018-08-10 09:10:05 +00:00
2018-08-28 03:07:36 +00:00
Cache::forget("avatar:{$profile->id}");
AvatarOptimize::dispatch($user->profile, $currentAvatar);
2018-08-10 09:10:05 +00:00
} catch (Exception $e) {
}
2018-08-28 03:07:36 +00:00
2018-08-10 09:10:05 +00:00
return redirect()->back()->with('status', 'Avatar updated successfully. It may take a few minutes to update across the site.');
}
public function getPath($user, $file)
{
$basePath = storage_path('app/public/avatars');
$this->checkDir($basePath);
$id = $user->profile->id;
$path = $this->buildPath($id);
$dir = storage_path('app/'.$path);
$this->checkDir($dir);
2018-11-27 06:53:26 +00:00
$name = str_random(20).'_avatar.'.$file->guessExtension();
2018-08-28 03:07:36 +00:00
$res = ['root' => 'storage/app/'.$path, 'name' => $name, 'storage' => $path];
2018-08-10 09:10:05 +00:00
return $res;
}
public function checkDir($path)
{
2018-08-28 03:07:36 +00:00
if (!is_dir($path)) {
2018-08-10 09:10:05 +00:00
mkdir($path);
}
}
public function buildPath($id)
{
$padded = str_pad($id, 12, 0, STR_PAD_LEFT);
$parts = str_split($padded, 3);
2018-08-28 03:07:36 +00:00
foreach ($parts as $k => $part) {
if ($k == 0) {
$prefix = storage_path('app/public/avatars/'.$parts[0]);
$this->checkDir($prefix);
}
if ($k == 1) {
$prefix = storage_path('app/public/avatars/'.$parts[0].'/'.$parts[1]);
$this->checkDir($prefix);
}
if ($k == 2) {
$prefix = storage_path('app/public/avatars/'.$parts[0].'/'.$parts[1].'/'.$parts[2]);
$this->checkDir($prefix);
}
if ($k == 3) {
$avatarpath = 'public/avatars/'.$parts[0].'/'.$parts[1].'/'.$parts[2].'/'.$parts[3];
$prefix = storage_path('app/'.$avatarpath);
$this->checkDir($prefix);
}
2018-08-10 09:10:05 +00:00
}
2018-08-28 03:07:36 +00:00
2018-08-10 09:10:05 +00:00
return $avatarpath;
}
2018-06-01 02:36:58 +00:00
}