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 用户对存储目录有读写权限:

  1. 右键 storage 目录

  2. 属性 -> 安全

  3. 编辑 -> 添加

  4. 添加 NETWORK SERVICE 用户并给予完全控制权限

通过上面的配置,就能正确访问上传的文件或者图片

总结

Windows 服务器环境下的文件上传问题主要涉及:

  • 软链接的正确创建

  • Nginx 的正确配置

  • 目录权限的正确设置

通过以上步骤的配置和调试,可以确保文件上传和访问功能正常工作。

更多推荐