Windows 服务器下 ThinkPHP 项目文件上传和访问问题解决方案
问题描述
在 Windows 服务器环境下,ThinkPHP 项目的文件上传功能实现后,通过软链接访问上传的图片出现无法显示的问题。
代码分析
1. 文件上传实现
上传控制器处理文件上传:
// 上传到 storage/app/public 目录
$savename = Filesystem::disk('public')->putFile('images', $file);
// 生成访问路径(通过软链接访问)
$url = '/storage/' . str_replace('\\', '/', $savename);
文件保存在 storage/app/public 目录,通过软链接 /storage 访问。
2. 存储初始化
项目提供了初始化存储目录的命令:
// 创建目录
if (!is_dir($storagePath)) {
mkdir($storagePath . '/images', 0755, true);
mkdir($storagePath . '/files', 0755, true);
$output->writeln('Storage directories created successfully.');
}
// 创建软链接
if (!file_exists($publicPath)) {
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
exec('mklink /D "' . $publicPath . '" "' . $storagePath . '"');
} else {
symlink($storagePath, $publicPath);
}
$output->writeln('Symlink created successfully.');
}
解决方案
1. 目录结构
确保正确的目录结构:
project/
├── public/
│ └── storage -> ../storage/app/public
└── storage/
└── app/
└── public/
├── images/
└── files/
2. 软链接创建
在 Windows 服务器上,需要以管理员权限执行以下步骤:
1.删除现有目录:
rd /s /q public\storage
2.创建软链接:
mklink /D "public\storage" "..\storage\app\public"
3. Nginx 配置
在 nginx.conf 或站点配置文件中添加:
server {
root D:/wwwroot/your-project/public;
location /storage { #这里使用的是storage命名
alias D:/wwwroot/your-project/storage/app/public/;
add_header Access-Control-Allow-Origin *;
types {
image/jpeg jpg jpeg;
image/png png;
image/gif gif;
application/pdf pdf;
application/msword doc;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.ms-excel xls;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
}
}
}
4. 权限设置
确保 nginx 用户对存储目录有读写权限:
-
右键 storage 目录
-
属性 -> 安全
-
编辑 -> 添加
-
添加 NETWORK SERVICE 用户并给予完全控制权限
通过上面的配置,就能正确访问上传的文件或者图片
总结
Windows 服务器环境下的文件上传问题主要涉及:
-
软链接的正确创建
-
Nginx 的正确配置
-
目录权限的正确设置
通过以上步骤的配置和调试,可以确保文件上传和访问功能正常工作。