我有照片库页面,其中显示了来自给定目录的所有文件。我有以下处理图片的逻辑:
- 原始图片我保存在
storage/app/img
- 使用控制台命令和
InterventionImage
库我创建拇指-在public/thumbs_md
我保持小拇指约300x300和在public/thumbs_lg
我保持相同的图片,但1024x768。
我对画廊页面的想法是,我从thumbs_md
内的给定目录中找到所有文件,并将它们显示为指向thumbs_lg
内具有相同名称的文件的链接的拇指。每张图片都应该有描述,我使用InterventionImage
库从$image->exif('ImageDescription')
中获取。并在页面上分页20张图片的结果。它工作得很好,在目录中少于200张图片,但当它是nginx给我504网关超时。我从exif的描述中找到了原因。EXIF信息仅存储在storage/app/img
内的原始源图片中。在拇指生成过程中,EXIF被删除。我找不到保存它的方法。也许这就是为什么我得到"网关超时"的主要原因。我想我有两个问题:
- 从大源文件而不是从拇指获取EXIF需要更长的时间,但我不知道如何将EXIF数据从源图像复制到拇指。
- 我一次从目录中的所有文件中检索exif数据,但我不知道如何将其分割成块,因为我必须立即给所有元素分页器
目前我只是评论代码,我从所有文件中读取EXIF,没有问题,但我想得到这些描述,我真的不想在数据库中保留图像描述。我喜欢它是图像的一部分。是否有一种方法来优化我的代码?
控制器
public function item($slug)
{
$files = Storage::disk('storage')->allFiles('thumbs_md/'.$slug);
$links = Storage::disk('storage')->allFiles('thumbs_lg/'.$slug);
if ( empty($files) ){
abort(404);
}
// generate title of the page
try {
$image = Image::make( '/var/www/storage/app/img/categories/'. $slug.'.jpg');
}
catch(NotReadableException $e)
{
// If error
$title = 'Picture not found';
}
// If no error ...
$title = $image->exif('ImageDescription');
// generate description for picture
$ImageDescription = function($value) {
try { $image = Image::make(str_replace('thumbs_md', '/var/www/storage/app/img', $value)); }
catch(NotReadableException $e)
{
// If error
return 'Picture not found';
}
// If no error ...
return $image->exif('ImageDescription');
};
//$imgDesc = array_map($ImageDescription, $files);
for ($i=0; $i < count($files); $i++) {
$items[$i]['thumb'] = $files[$i];
$items[$i]['link'] = $links[$i];
//$items[$i]['description'] = $imgDesc[$i];
}
$items = Arr::arrayToObject($items);
$items = collect($items)->mypaginate($perPage = 20);
$items->title = $title;
$items->slug = $slug;
return view('pages.gallery.item', compact('items'));
}
<<p>视图/strong><div class="gallery">
@foreach ($items as $item)
<a href="/storage/{{ $item->link }}" class="lightGallery">
<img {{-- alt="{{ $item->description }}" --}} src="/storage/{{ $item->thumb }}">
{{-- <p>{{ $item->description }}</p> --}}
</a>
@endforeach
</div>
我不明白为什么不把这些东西放在数据库中,因为您已经清楚地表明从大文件中检索EXIF数据很慢。你不希望在每次加载页面时都做繁重的工作。
您还可以轻松地过滤数据,只要它不在数据库表中。
代码你目前写得很糟糕,不性能(你正在检索页面标题从图像???),所以要去的方式是设计一些数据库表来处理这个:)。一旦完成,我打赌你可以把这个控制器缩小到7行以下。
在请求过程中应尽可能避免密集或耗时的处理,以获得更好的用户体验。
优化工作流程的一种方法是:
为目录
创建数据库表创建列
的image_categories
表- 名称(字符串)
- 蛞蝓(字符串)(独特的)
- title(string): exif('ImageDescription')或任何值
- exif(text):如果需要,分类图像的整个exif数据
为Images创建数据库表创建列为
的images
表- image_category(string):用于图像类别
- src(string):原始图像的路径
- src_thumb_md(string): thumb_md(300 x 300)图像的路径
- src_thumb_lg(string): thumb_lg(1024 x 768)图像的路径
- 描述(string): exif (ImageDescription)
- exif(text):如果需要,图像的整个exif数据
为图像创建缩略图时存储数据
将用于生成缩略图的控制台命令扩展到
- 将所有图像的路径和出口数据存储到
images
表 - 在为 类别存储图像时,将标题和出口数据存储到
image_categories
表中定义带有关系的Image和ImageCategory模型(可选)
class ImageCategory extends Model
{
public function images()
{
return $this->hasMany(ImageCategory::class, 'image_category');
}
}
class Image extends Model
{
public function imageCategory()
{
return $this->belongsTo(ImageCategory::class, 'image_category', 'slug');
}
}
控制器,视图h5> 果模型被定义
public function item($slug)
{
$category = ImageCategory::where('slug', $slug)->first();
$images = $category->images()->paginate(20);
return view('pages.gallery.item', compact('category', 'images'));
}
public function item($slug)
{
$category = ImageCategory::where('slug', $slug)->first();
$images = $category->images()->paginate(20);
return view('pages.gallery.item', compact('category', 'images'));
}
或者当模型没有定义时
public function item($slug)
{
$category = DB::tables('image_categories')->where('slug', $slug)->first();
$images = DB::table('images')->where('image_category', $slug)->paginate(20);
return view('pages.gallery.item', compact('category', 'images'));
}
<div class="gallery">
<h1>{{ $category->title }}</h1>
@foreach ($images as $image)
<a href="/storage/{{ $image->src_thumb_lg }}" class="lightGallery">
<img {{-- alt="{{ $image->description }}" --}} src="/storage/{{ $image->src_thumb_md }}">
{{-- <p>{{ $image->description }}</p> --}}
</a>
@endforeach
<!-- Pagination links -->
{{ $images->links() }}
</div>