我需要将图像存储在后端用于登录用户。存储的图像需要受到保护,并且不能从外部(公共)看到。我为此选择了一个“存储”文件夹。
我在控制器中想出了这个:
public function update(Request $request, $id)
{
//Show the image
echo '<img src="'.$_POST['img_val'].'" />';
//Get the base-64 string from data
$filteredData=substr($_POST['img_val'], strpos($_POST['img_val'], ",")+1);
//Decode the string
$unencodedData=base64_decode($filteredData);
//Save the image
$storagepath = storage_path('app/images/users/' . Auth::user()->id);
$imgoutput = file_put_contents($storagepath.'/flyer.png', $unencodedData);
return view('backend.flyers.index')->withImgoutput($imgoutput)
//->withStoragepath($storagepath);
}
点击保存按钮后,触发更新()我能够在我的视图中看到图像,它也存储在我的文件夹中(当前用户= 10)“storage / app / images / users / 10 /flyer.png“
我的问题是如何访问图像路径? 我想用img src =“”&gt;来显示存储的图像。我不知道在“src = ...”
里面放什么答案 0 :(得分:2)
在处理Web应用程序中的用户文件上传时,主要方面是关于用户内容的安全性。 应该使用安全的方式在Web应用程序中上载用户的私有文件。
在您的情况下,您希望访问公用文件夹外的用户图像。 这可以通过下面给出的最安全的方式完成。
首先在Laravel的根目录(公共文件夹所在的位置)创建一个目录,让目录的名称为uploads
。使用此目录上传私人用户文件。
对于图像,在uploads目录中创建上传内的另一个目录uploads/images/
,以便为不同类型的文件创建不同的存储位置。
请记住使用不同的名称上传图像目录中的图像,而不使用其扩展名,以使其看起来像无扩展名文件。 将文件名及其扩展名保存在数据库中,稍后可以使用该文件名保留图像的位置。
现在您需要创建一个单独的路线来显示用户的图像。
Route::get('users/{id}/profile_photo', 'PhotosController@showProfilePhoto')->name('users.showProfilePhoto');
PhotosController.php
class PhotosController extends Controller {
private $image_cache_expires = "Sat, 01 Jan 2050 00:00:00 GMT";
public function showProfilePhoto($id) {
$user = User::find($id);
$path = base_path() . '/uploads/images/';
if($user && $user->photo) // Column where user's photo name is stored in DB
{
$photo_path = $path . $user->photo; // eg: "file_name"
$photo_mime_type = $user->photo_mime_type; // eg: "image/jpeg"
$response = response()->make(File::get($photo_path));
$response->header("Content-Type", $photo_mime_type);
$response->header("Expires", $this->image_cache_expires);
return $response;
}
abort("404");
}
}
在访问名为 - showProfilePhoto($user_id)
的路线时,PhotosController内部的方法 - users.showProfilePhoto
将立即运行。
您的HTML代码将如下所示。
<img src="<?php echo route('users.showProfilePhoto', array('id' => $user->id)); ?>" alt="Alter Text Here">
上面的代码将像魅力一样工作,图像将显示给用户,而不会向公众声明/发布正确的图像路径。 据我所知,这是处理Web应用程序中文件上传的安全方法。
答案 1 :(得分:0)
你可以这样做:
Route::get('images/{filename}', function ($filename)
{
$path = storage_path() . '/' . $filename;
if(!File::exists($path)) abort(404);
$file = File::get($path);
$type = File::mimeType($path);
$response = Response::make($file, 200);
$response->header("Content-Type", $type);
return $response;
});
参考:
Laravel 5 - How to access image uploaded in storage within View?
或者您可以使用此库:https://github.com/thephpleague/glide
只需使用composer将其安装到您的项目中
默认情况下,这会从您的存储中渲染图像,并允许您使用它进行各种操作,例如裁剪,颜色校正等。
参考:
http://glide.thephpleague.com/
https://laracasts.com/discuss/channels/laravel/laravel-5-how-can-we-access-image-from-storage?page=1
答案 2 :(得分:0)
由于种种原因,有时您可能会有一些图像不希望存储在公共目录中。
虽然存储图像有很多优点。
有很多方法可以实现这一点,但我有这个简单的解决方案。
如果已经没有一个
,你应该创建一个这样的帮助器类<?php namespace App\Services;
class Helper
{
public function imageToBase64($path)
{
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
return 'data:image/' . $type . ';base64,' . base64_encode($data);
}
}
然后在你的视野中(刀片)
@inject('helper', 'App\Services\Helper')
<img width="200" height="250" src="{{$helper->imageToBase64(storage_path('app/images/users/' . Auth::user()->id)}}">
答案 3 :(得分:0)
它会 100% 工作。在 app/config/filesystem.php 中打开文件文件系统并像这样写
'profile' => [
'driver' => 'profile',
'root' => '/home/folder/public_html/projectname/public/profiles',
],
在顶部添加此文件
use Illuminate\Support\Facades\Storage;
我的变量名是
$directoryName = 'profile';
$imageName = $request->image; // image is array of base64 encoded urls
$directory_path ='profiles';
以下功能将您的文件保存在 public/profiles 文件夹中。
function UploadImagesByBase64($directoryName, $imageName,$directory_path)
{
$data = array();
$image = $imageName;
foreach ($image as $image_64) {
if($image_64 !=null){
$extension = explode('/', explode(':', substr($image_64, 0, strpos($image_64, ';')))[1])[1]; // .jpg .png .pdf
$replace = substr($image_64, 0, strpos($image_64, ',')+1);
// find substring fro replace here eg: data:image/png;base64,
$image = str_replace($replace, '', $image_64);
$image = str_replace(' ', '+', $image);
$imageName = Str::random(10).time().'.'.$extension;
Storage::disk($directoryName)->put($imageName, base64_decode($image));
$data[] = $directory_path.'/'.$imageName;
}
}
$imageName = implode(',', $data);
return $imageName;
}