我已将 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;
}
}
如果需要,我将放置项目的文件夹和文件权限。这可能是权限问题。
storage/app/public folder
请注意,Livewire 本身并未创建
文件夹。我 创建它并授予它 755 权限。livewire-tmp
public
文件夹,带有指向 storage/app/public
文件夹 的符号链接
如果有人知道 Livewire 无法处理上传的原因可以与我分享他们的知识,我将非常感激。 🙂
解决方案
转到
vendor/livewire/livewire/src/Controllers/FileUploadHandler.php
并评论此行abort_unless(request()->hasValidSignature(), 401);
转到
vendor/livewire/livewire/src/TemporaryUploadedFile.php
,而不是这个$tmpfile = tmpfile();
,写下:
$tmpfname = tempnam(sys_get_temp_dir(), '');
$tmpFile = fopen($tmpfname, 'w');
转到应用程序的
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 权限。
说明
我们需要注释该行,因为它会检查您是否有
ssl certificate
。如果没有,它将中止请求。如果您有ssl证书,可以跳过此步骤。
在此步骤中,我们创建
temporary file
并授予写入权限。
最后一步只是创建一个
symbolic link
。我们需要创建这个 symbolic link
,因为上传文件时,Livewire 会使用该 url 创建一个临时文件。
@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
我正在使用共享主机,并且我在我的 php.ini 文件上更改了此值
upload_max_filesize
。