【问题标题】:Laravel 5.4 display image from storage without symlinkLaravel 5.4 从没有符号链接的存储中显示图像
【发布时间】:2018-02-22 23:33:09
【问题描述】:

我目前正在保存用户上传到 storage/dokumentarkiv/{{$building->id}}/byggbilder 的图像,并使用干预来保存图像的缩略图。然后我想在我的视图中以网格的形式显示所有图像。下面的代码正在运行,但我想知道是否有一种更简洁的方式来显示图像,因为将图像编码为 data-url 为我提供了 html 中每个图像的 base64 代码。

我的控制器:

public function storeImage(Request $request, $id)
{
    $building = Building::find($id);

    $file = $request->file('imageInput');

    $fileName = $request->imageName;
    $fileOriginalName = $request->file('imageInput')->getClientOriginalName();
    $fileExtension = $request->file('imageInput')->getClientOriginalExtension();
    $fileSize = $request->file('imageInput')->getSize();
    $mimeType = $request->file('imageInput')->getMimeType();
    $path = $building->id.'/byggbilder'.'/';
    $thumbnailPath = $building->id.'/byggbilder'.'/thumbnails'.'/';
    $thumbnailOriginalName = $request->file('imageInput')->getClientOriginalName();

    $image = new Image;

    $image->name = $fileName;
    $image->original_name = $fileOriginalName;
    $image->path = $path;
    $image->thumbnail_path = $thumbnailPath;
    $image->thumbnail_original_name = $thumbnailOriginalName;
    $image->file_extension = $fileExtension;
    $image->file_size = $fileSize;
    $image->mime_type = $mimeType;

    $building->buildingImages()->save($image);
    $dateTime = $image->created_at->format('d-m-Y-H-i-s');

    $mImage = Img::make($request->file('imageInput')->getRealPath());

    $mImage->save(storage_path('dokumentarkiv/').$path.'('.$dateTime.')'.$fileOriginalName)
           ->resize(300, null, function ($constraint) {
             $constraint->aspectRatio();
             $constraint->upsize();
           })
           ->save(storage_path('dokumentarkiv/').$thumbnailPath.'('.$dateTime.')'.$fileOriginalName);

    return redirect()->back();
}

检索图像并将其传递给视图的函数:

public function administration(Request $request, $id)
{
    $moderator = Auth::user();

    $building = Building::find($id);
    $buildingID = $building->id;

    // Find the buildings users
    $buildingsUsers = $building->users()->get();

    // Find the buildings images
    $images = $building->buildingImages()->get();

    foreach ($images as $image) {
      $test = (string) Img::make(storage_path('dokumentarkiv/25/byggbilder/(30-01-2017-17-20-46)logo-test.png'))->encode('data-url');
    }

    return view('users.buildingAdministration', compact('moderator', 'building', 'buildingID', 'buildingsUsers', 'images', 'test'));
}

我只是硬编码了 url 来测试它是否有效。当我找到一个好的解决方案时,我会将其更改为动态的。

我的看法:

<img src="{{$test}}" alt="">

我也尝试在我的视图中使用它:

@php
 $img = Image::make(file_get_contents(storage_path('dokumentarkiv/25/byggbilder/(30-01-2017-17-20-46)logo-test.png')));
 echo $img->response();
@endphp

但这只是在页面上显示为:

HTTP/1.0 200 OK Cache-Control: no-cache, private Content-Length: 9957
Content-Type: image/png �PNG  IHDR*J�� pHYs���+
IDATx��{�e���[Փ�1�D6و9!�����D@Z\
Dȸ��"˲D�;�9{��(���Q�f��
f��f�6�6�,ƨ1f#Lf��w�x޺tu�tu��n�>��t׽���W���<
��ֲ;�f� ��X�PA�:��
�{c���S��u�{w.>��]�J�(�W`Ɖj��х�;�a`��'�i�Yh�KK 
]�e^E�UDb����^U�۵�?~��n��/S�D��3FTkV�\ �
:xDB�y���7P�,�4%DUI-s

感谢所有投入!

【问题讨论】:

  • 据我所知,如果没有符号链接,您无法从存储文件夹中获取文件...如果我错了,请纠正我
  • @lewis4u 我发现的所有解决方案都使用了synlinks,但我不能使用symlinks,因为图像不应该被所有人访问。这就是为什么我在存储而不是公共中创建图像文件夹的原因。
  • 那么你必须使用中间件......你不能为某些用户提供图像,而另一些用户则不能......你必须为此使用中间件并说明该用户是否有权看到了就可以看到,没有权利就看不到
  • @lewis4u 我觉得奇怪的是,从存储中检索文档很容易,但检索图像却如此困难。所以我一定做错了什么。但是,如果我创建一个从 Storage 文件夹到 Public 的符号链接,人们是否能够在浏览器开发人员工具中看到该文件夹​​?这就是我对创建符号链接的担忧。

标签: php image laravel intervention laravel-5.4


【解决方案1】:

你可以在控制器中创建一个方法

MediaController@getImage($path){
    $img = Image::make($path);
    return $img->response();
}

然后你可以为这个方法分配一个中间件。

感谢,继续努力

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 2017-12-29
    • 2018-10-15
    • 2021-05-17
    • 2019-01-11
    • 2018-06-20
    • 1970-01-01
    • 2018-05-04
    • 2018-06-18
    相关资源
    最近更新 更多