ThinkPHP 项目的文件上传功能实现后,通过软链接访问上传的图片出现无法显示的问题。
Windows 服务器下 ThinkPHP 项目文件上传和访问问题解决方案
问题描述
在 Windows 服务器环境下,ThinkPHP 项目的文件上传功能实现后,通过软链接访问上传的图片出现无法显示的问题。
代码分析
1. 文件上传实现
上传控制器处理文件上传:
ini
代码解读
复制代码
// 上传到 storage/app/public 目录 $savename = Filesystem::disk('public')->putFile('images', $file); // 生成访问路径(通过软链接访问) $url = '/storage/' . str_replace('\\', '/', $savename);
文件保存在 storage/app/public 目录,通过软链接 /storage 访问。
2. 存储初始化
项目提供了初始化存储目录的命令:
bash
代码解读
复制代码
// 创建目录 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. 目录结构
确保正确的目录结构:
arduino
代码解读
复制代码
project/ ├── public/ │ └── storage -> ../storage/app/public └── storage/ └── app/ └── public/ ├── images/ └── files/
2. 软链接创建
在 Windows 服务器上,需要以管理员权限执行以下步骤:
1.删除现有目录:
bash
代码解读
复制代码
rd /s /q public\storage
2.创建软链接:
arduino
代码解读
复制代码
mklink /D "public\storage" "..\storage\app\public"
3. Nginx 配置
在 nginx.conf 或站点配置文件中添加:
bash
代码解读
复制代码
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 的正确配置
-
目录权限的正确设置
通过以上步骤的配置和调试,可以确保文件上传和访问功能正常工作。
更多推荐

所有评论(0)