thinkphp上传文件到自定义路径

$savename = \think\facade\Filesystem::disk('public')->putFile( 'topic', $file);

我看了一下源码,发现putFile函数的第一个参数是路径,也是上面的"topic",然后就想传个自己定义的路径,谁知道传过去一直是系统默认的路径,把老夫给气得,接下来说一下改的步骤:

  1. 在/vendor/topthink/framework/src/think/filesystem/Driver.php 文件,找到函数putFileAs
public function putFileAs(string $path, File $file, string $name, array $options = [])
{   
        在这里打印$path是正常的
        
        $dir_path = $path;
        
        $stream = fopen($file->getRealPath(), 'r');
        
        $path = trim($path . '/' . $name, '/');  可以看到这里在路径后面加上了上传文件的名字,所以我在上面定义了一个变量$dir_path,这是我自己传过来的路径
        
        
        在这个函数中传过去
        $result = $this->putStream($path, $stream, $options,$dir_path);
  
        
        if (is_resource($stream)) {
            fclose($stream);
        }

        return $result ? $path : false;
}

putStream 这个函数的文件路径是/vendor/league/flysystem/src/Filesystem.php,

找到函数putStream

public function putStream($path, $resource, array $config = [],string $dir_path = null)
    {
        if ( ! is_resource($resource)) {
            throw new InvalidArgumentException(__METHOD__ . ' expects argument #2 to be a valid resource.');
        }

        $path = Util::normalizePath($path);
        $config = $this->prepareConfig($config);
        Util::rewindStream($resource);
        
        在这个地方加上自己的代码
        if(!empty($dir_path) && is_dir($dir_path)) {
            $this->adapter->setPathPrefix($dir_path);
        }
        
        
        
        if ( ! $this->getAdapter() instanceof CanOverwriteFiles && $this->has($path)) {
            return (bool) $this->getAdapter()->updateStream($path, $resource, $config);
        }

        return (bool) $this->getAdapter()->writeStream($path, $resource, $config);
    }

之所以在那儿加是因为我们打印一下$this->getAdapter(),会发现路径变成了系统默认路径,找一下getAdapter函数,打印一下这个$this->adapter,发现此时的路径是自己传的,到了函数putStream()中就变成了系统默认路径,这中间一定发生了什么,但是我们先不用去深究,最简单的方法就是给它重新赋值,然后再试试上传文件发现已经好了

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章