Laravel - 生产中图像显示出现符号链接问题,但在开发环境中工作正常

问题描述 投票:0回答:1

当我将 Laravel / Livewire 网站部署到生产环境时,我遇到了在 Laravel / Livewire 网站上显示图像的问题。奇怪的是,图像通过符号链接正确保存在存储文件夹中,但当我尝试将它们加载到页面上时,它们无法正确显示。此问题仅出现在生产环境中,并且仅针对保存在存储文件夹中的图像,而在开发环境中一切正常。

这是我用来保存和显示图像的代码:

上传到存储的方法:

    public function uploadImage(){
       

        $this->validate([
            'image' => 'image|mimes:jpeg,jpg,png,gif|max:2048',
             // valida che il file sia un'immagine e abbia una dimensione massima di 2MB
        ]);

        // Verifica se la directory di destinazione esiste, altrimenti creala
        $societaId = Auth::user()->societa_id;
        $storageDirectory = 'public/immagini_associato/associazione_' . $societaId;

        if (!Storage::exists($storageDirectory)) {
            Storage::makeDirectory($storageDirectory, 0755, true); // crea la directory 
        }
        // Genera un nome univoco per l'immagine
        $imageName = 'immagine_associato_' . $this->associato->id . '.' . $this->image->getClientOriginalExtension();

        
        // Salva l'immagine nello storage
        $this->image->storeAs($storageDirectory, $imageName);
        $this->alert('success', 'Immagine caricata correttamente');
        $this->emit('refreshComponent');
    }

这是在安装上显示图像的方法:

    public function mount()
    {
        // Verifica se esiste un'immagine per l'associato
        $societaId = Auth::user()->societa_id;
        $imageName = 'immagine_associato_' . $this->associato->imagePath. ; 
        $directory = 'immagini_associato/associazione_' . $societaId;
        
        // Verifica se l'immagine esiste nello storage pubblico
        if (Storage::disk('public')->exists($directory . '/' . $imageName)) {
            $this->imagePath = asset('storage/' . $directory . '/' . $imageName);
        } else {
           
            // Utilizza un'immagine di default se l'immagine non esiste
            $this->imagePath = asset('assets/img/avatars/avatarUnknown.jpg');
        }

    }

我不得不说我可以看到这张图片:

$this->imagePath = asset('assets/img/avatars/avatarUnknown.jpg');

但这不起作用(仅在生产中)

$this->imagePath = asset('storage/' . $directory . '/' . $imageName);

在我的开发环境中,一切都按预期运行,但是当我部署到生产环境并尝试访问浏览器中的图像时,出现 404 错误。

什么可能导致此问题以及如何解决?

预先感谢您的任何帮助或建议!

这应该提供我的问题的全面概述,包括使用符号链接来访问存储目录。

laravel storage symlink laravel-10
1个回答
0
投票

我添加了请求方法然后$this。

public function uploadImage(Request $request)
{
    $request->validate([
        'image' => 'image|mimes:jpeg,jpg,png,gif|max:2048',
    ]);

    $societaId = Auth::user()->societa_id;
    $storageDirectory = 'public/immagini_associato/associazione_' . $societaId;

    if (!Storage::exists($storageDirectory)) {
        Storage::makeDirectory($storageDirectory, 0755, true);
    }

    // Generate a unique name for the image
    $imageName = 'immagine_associato_' . $this->associato->id . '.' . $request->image->getClientOriginalExtension();

    $request->image->storeAs($storageDirectory, $imageName);

    $this->alert('success', 'Immagine caricata correttamente');
    $this->emit('refreshComponent');
}

在 Mount 中,$this->associato->imagePath

之后有一个额外的点 (.)
public function mount()
{
    $societaId = Auth::user()->societa_id;
    $imageName = 'immagine_associato_' . $this->associato->id; // Remove the concatenation with $this->associato->imagePath
    $directory = 'immagini_associato/associazione_' . $societaId;

    if (Storage::disk('public')->exists($directory . '/' . $imageName)) {
        $this->imagePath = asset('storage/' . $directory . '/' . $imageName);
    } else {
        $this->imagePath = asset('assets/img/avatars/avatarUnknown.jpg');
    }
}

并清除缓存。

© www.soinside.com 2019 - 2024. All rights reserved.