Livewire 图像上传在生产服务器上失败

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

我已将 Laravel 项目部署到 LEMP 堆栈顶部的 vps 服务器(ubuntu)。除了图像上传之外,Livewire 一切正常。

图像上传本身在我的本地环境中运行良好

当我尝试上传图像时,Livewire 抛出验证错误,并显示

The icon failed to upload.

这是因为 Livewire 无法创建

livewire-tmp
文件夹。我自己创建了该文件夹并给了它 755 权限,但它仍然不起作用。我还发布了 livewire 配置文件并更改了一些配置,但仍然相同。

我不知道为什么Livewire无法创建

livewire-temp
文件夹并在其中存储临时文件。也许这与 nginx 服务器配置有关。所以我分享我的 ngnix 配置:

server {
    listen 80 default_server;
    #listen [::]:80 default_server;

    root /var/www/html/west-hospital-admin/public;
    #root /home/west/west-hospital-admin/public;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html index.php;
    server_name _;

    location / {
        try_files $uri $uri/ /index.php$query_string;
    }
    # pass PHP scripts to FastCGI server

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    }
}

如果需要,我将放置项目的文件夹和文件权限。这可能是权限问题。

enter image description here

storage/app/public folder

请注意,Livewire 本身并未创建

livewire-tmp
文件夹。我 创建它并授予它 755 权限。

enter image description here

public
文件夹,带有指向
storage/app/public
文件夹

的符号链接

enter image description here

如果有人知道 Livewire 无法处理上传的原因可以与我分享他们的知识,我将非常感激。 🙂

php laravel nginx vps laravel-livewire
3个回答
2
投票

解决方案

  1. 转到

    vendor/livewire/livewire/src/Controllers/FileUploadHandler.php
    并评论此行
    abort_unless(request()->hasValidSignature(), 401);

  2. 转到

    vendor/livewire/livewire/src/TemporaryUploadedFile.php
    ,而不是这个
    $tmpfile = tmpfile();
    ,写下:

     $tmpfname = tempnam(sys_get_temp_dir(), '');
     $tmpFile = fopen($tmpfname, 'w');
    
  3. 转到应用程序的

    public
    文件夹并创建
    livewire
    文件夹。(
    mkdir livewire
    ) 之后,转到该目录,从那里您将创建一个符号链接,从
    public/livewire/preview-file
    指向应用程序的
    storage/app/public/livewire-tmp 
    文件夹:

ln -s preview-file ../../storage/app/public/livewire-tmp

请记住,您需要为

storage/app/public
文件夹内的文件夹授予 755 权限。

说明

  1. 我们需要注释该行,因为它会检查您是否有

    ssl certificate
    。如果没有,它将中止请求。如果您有ssl证书,可以跳过此步骤。

  2. 在此步骤中,我们创建

    temporary file
    并授予写入权限。

  3. 最后一步只是创建一个

    symbolic link
    。我们需要创建这个
    symbolic link
    ,因为上传文件时,Livewire 会使用该 url 创建一个临时文件。


2
投票

@toghrul-nasirli 帮助完成了步骤 1,但就我而言,我必须在 Ubuntu 上使用 775 而不是 755,并跳过步骤 2,3。然后从项目根目录我允许为网站访问者上传图像:

sudo chmod -R 775 public/assets/imgs
sudo chown -R $USER:www-data public/assets/imgs

ps。不要使用 777


0
投票

我正在使用共享主机,并且我在我的 php.ini 文件上更改了此值

upload_max_filesize

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