ThinkPHP 项目的文件上传功能实现后,通过软链接访问上传的图片出现无法显示的问题。

220 阅读2分钟

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

  1. 右键 storage 目录

  2. 属性 -> 安全

  3. 编辑 -> 添加

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

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

总结

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

  • 软链接的正确创建

  • Nginx 的正确配置

  • 目录权限的正确设置

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