Laravel不会在生产服务器上显示图像

时间:2018-01-19 05:42:48

标签: php image laravel laravel-5

我的生产服务器是ubuntu Ubuntu 16.04.3 LTS,我有laravel 5.5 在路线:

  

的/ var / WWW / forumb

我的公共文件夹位于以下目录中:

  

的/ var / WWW / forumb /公共

用户上传图片,这些图片保存在:

  

的/ var / WWW / forumb /公共/上传/图像

images文件夹具有777权限 在图像文件夹中有使用封面的图像 这些从视图中显示为正常

问题是从视图中看不到上传用户的图像,这些图像位于相同的文件夹图像中

我可以直接在浏览器中看到的封面图片如下:

  

http://forumb.com/uploads/images/banner1.jpeg

用户图片

  

http://forumb.com/uploads/images/5fa7385e1542a31ab9c34419b4d914fe81a11449.jpeg

但是这些无法看到,laravel返回404错误

从视图中可以看到的唯一图像是与框架一起出现的图像文件夹中的图像

直到我将图像从filezilla上传到服务器但看不到任何其他内容之后才能看到所有其他

这只发生在生产服务器上,在我的localhost上一切正常

这是视图中的mi代码

<img class="card-img-top border-bot" src="{{ !is_null(user()->image) ? $profile_image : '/uploads/images/facebook-default-no-profile-pic.jpg' }}" class="img-fluid rounded mx-auto d-block" alt="{!! user()->nombre_empresa !!}">

这是我的控制器

public function index()
{
    $perPage = 6;
    $page = input('page', 1);
    $baseUrl = config('app.url') . '/news-and-events';
    $items = News::whereHas('photos')->with('photos')->active()->orderBy('active_from', 'DESC')->select('news.*')->get();
    $profile_image = profile_image();
    $total = $items->count();

    // paginator
    $paginator = new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(),
        $perPage, $page, ['path' => $baseUrl, 'originalEntries' => $total]);

    // if pagination ajax
    if (request()->ajax()) {
        return response()->json(view('website.news_events.pagination')
            ->with('paginator', $paginator)
            ->render());
    }

    return $this->view('news_events.news_events')->with('paginator', $paginator)->with('profile_image', $profile_image);
}

profile_image()函数

function profile_image()
{
    $image = user()->image;
    $gender = user()->gender;
    if ($image && strlen($image) > 5) {
        return '/uploads/images/' . $image;
    }
    else {
        return "/images/admin/$gender.png";
    }
}

图像正常上传但未显示

3 个答案:

答案 0 :(得分:2)

将上传的文件保存到磁盘时,Laravel会将文件放在storage/app/public而不是public。因此,您需要创建一个符号链接,以便从Web访问这些文件。

  

公共磁盘使用本地驱动程序并将这些文件存储在storage/app/public中。要通过网络访问它们,您应创建从public/storagestorage/app/public

的符号链接      

要创建符号链接,您可以使用storage:link Artisan命令:

php artisan storage:link

https://laravel.com/docs/5.5/filesystem#the-public-disk

答案 1 :(得分:0)

我也遭受这个问题的困扰。在我的本地主机上,我可以上传和查看图像。在服务器上,尽管我可以在公共/存储中看到图像,但是我可以上传图像,但不能在浏览器中查看图像。后来我发现我指错了图像。我希望对我有用的东西对您有用。这些就是我所做的。

  1. 将项目上载到服务器。就我而言,是

    |-www |--laravelProject

  2. 运行$ php artisan storage:link或运行此脚本

    $exitCode = Artisan::call('storage:link', [] ); echo $exitCode; // 0 exit code for no errors.

  3. 我上传了图片

    $file = Storage::putFile('images', $request->file('my_image'));
    $baseUrl = url('/');
    $imagePath = $baseUrl.'/laravelProject/public/storage/'.$file;
    $input['image_path'] = $imagePath;
    $input['image_root'] = $file; //used when deleting
    MobileSlider::create($input);
    
  4. 我确认我的图片位于

  

www / laravelProject / public / storage / images

你可能是

  

public_html / laravelProject / public / storage / images

  1. 要在我的浏览器中访问图像
  

http://yoursite.com/laravelProject/public/storage/images/dfdbfdbfdfdhfkhdfhnduok.png

我不确定这是最好的方法,但是它对我有用。

答案 2 :(得分:0)

@Alexey Mezenin在回答您的问题here

时已很好地解释了您在生产中看不到图像的原因。

简而言之在laravel中,您必须使用命令创建指向公用文件夹中存储文件夹的链接 php artisan storage:link,然后您才能看到图像,

但是生产中的问题是我们不能直接运行命令,而可以通过编程方式运行它,

因此,编辑您的routes/web.php文件并添加以下几行:

Route::get('/any-route', function () {
  Artisan::call('storage:link');
});

重要提示:请记住,如果您在本地运行了该命令,则公用文件夹中已经存在该存储文件夹,因此首先必须删除{{1} }文件夹

然后您可以运行上述路由文件中所述的指定路由public/storage