Heim  >  Fragen und Antworten  >  Hauptteil

请问ThinkPHP 3.2 怎么读取 Public 下的资源文件?

目录结构:

project
|---App
|---Public
    |---blog-frontend
        |---Home
            |---js
            |---css
            |---img
            |---xxx.md
|---ThinkPHP
|---index.php

入口文件index.php内容如下:

if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',true);
// 定义应用目录
define('APP_PATH','./App/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
// 亲^_^ 后面不需要任何代码了 就是如此简单

在公共 config.php 配置过

'TMPL_PARSE_STRING' => array(
    '__STATIC__' => __ROOT__ . '/Public/blog-frontend',
),

并且使用在view中使用 Public 的资源:引入静态资源

<script src="__STATIC__/Home/js/jquery.min.js"></script>

上面代码是没有问题,引入成功。

然而在控制器中

function Xaction(){
    $file = "/Public/blog-frontend/Home/xxx.md";
    $fopen = fopen($file,'r');
    var_dump($fopen);
}

输出

false

奇怪,我又在 view 里面去试着 fopen

$file = "__STATIC__/Home/xxx.md";
$fopen = fopen($file,'r');
var_dump($fopen);

输出

false

我又试了 fopen 换成 file_get_contents 结果不管是控制器中或者view中的输出还是false。我于是把后缀的.md换成了.txt结果还是false

请问如何解决?
补充:
谢谢各位的帮助,通过 @jiny 的方法,问题已经解决了。

不知道出于什么原因,在下在 IndexController.class.php 打印

var_dump(__ROOT__); 
var_dump(__PUBLIC__); 

(以上是默认的,我没有配置过。)

output:

string(0) "" 
string(10) "__PUBLIC__" // 如果var_dump(__ABCDE__);// string(9) "__ABCDE__"
我想大声告诉你我想大声告诉你2683 Tage vor708

Antworte allen(7)Ich werde antworten

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 13:11:39

    function Xaction(){
        $file = $_SERVER['DOCUMENT_ROOT']."/Public/blog-frontend/Home/xxx.md";
        $fopen = fopen($file,'r');
        var_dump($fopen);
    }
    //在控制器里要这么写 $_SERVER['DOCUMENT_ROOT'] 

    Antwort
    0
  • 習慣沉默

    習慣沉默2017-05-16 13:11:39

    1. 首先你要明白当 PHP 执行 Xaction 这个方法的时候对应的路径是什么?
      ThinkPHP 中的入口文件担当着入口的作用,意味着方法的执行实际上都是在这一文件中去完成的(各种 require),所以执行 Xaction 的方法所在路径即为 index.php 所在的目录

    2. 建议使用相对路径
      既然知道当前脚本的所在路径,那么要获取 Public 下的资源文件就很清楚了

      $file = './Public/blog-frontend/Home/xxx.md'

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-16 13:11:39

    我一般用$file = __ROOT__."/Public/Home/xxx.md";

    Antwort
    0
  • 迷茫

    迷茫2017-05-16 13:11:39

    默认的 __PUBLIC__ 你可以打印看看。
    我看你测试的方式都不像是对的,不要急着换多种方式去证明自己的想法,整理好一个方式去一步一步来。

    Antwort
    0
  • 某草草

    某草草2017-05-16 13:11:39

    使用fopen的时候查看目录文件是否配置了相应权限,可能是这个原因。

    Antwort
    0
  • 漂亮男人

    漂亮男人2017-05-16 13:11:39

    谢邀!使用TP的系统常量__PUBLIC__引用

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-05-16 13:11:39

    谢邀,tp提供系统常量_PUBLIC_,可以在config下面定义好路径直接引用

    Antwort
    0
  • StornierenAntwort