有没有一种WP方法可以获得文件句柄?

时间:2012-11-29 作者:Tom Auger

我使用的是一个外部CSV读取库,它将文件句柄(资源)作为参数。我使用wp\\u handle\\u upload()实际处理文件并将其存储在Uploads目录中,但它返回的是文件路径,而不是资源。

$filehandle = fopen( $file[\'file\'], \'r\' ) 这里可以接受,还是有更好的WP替代方案?我看不到任何符合条件的东西file.php, 或者其他我看过的地方。

2 个回复
SO网友:chrisguitarguy

接下来的事情有点复杂。你可以使用fopenfile_get_contents 没有任何问题。

这是filesystem api. 它处理的是确定文件的所有权并返回正确的访问方式——大多数情况下,这只意味着正常的PHP函数(或direct 文件系统类)。

奥托有一个nice tutorial 在这个问题上,我复制/修改了它,以找出它是如何用于这个答案的。

基本上您使用request_filesystem_credentials 获取与文件系统交互的适当信息。这可能不是什么(例如,直接,请参阅上面的链接),也可能会向用户显示一个表单,以便他们可以输入FTP或SSH的用户名/密码。取决于服务器设置。

一些快速示例。让我们用一个简单的表单添加一个管理页面。

<?php
add_action(\'admin_menu\', \'wpse74395_add_menu_page\');
function wpse74395_add_menu_page()
{
    add_options_page(
        __(\'Filesystem\', \'wpse\'),
        __(\'Filesystem\', \'wpse\'),
        \'manage_options\',
        \'wpse-filesystem\',
        \'wpse74395_page_cb\'
    );
}

function wpse74395_page_cb()
{
    if(wpse74395_use_filesystem())
        return;

    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2><?php _e(\'Filesystem Practice\', \'wpse\'); ?></h2>
        <form method="post" action="">
            <?php wp_nonce_field(\'wpse74395-nonce\'); ?>
            <p><input name="save" type="submit" value="<?php esc_attr_e(\'Go!\', \'wpse\'); ?>" class="button-primary" /></p>
        </form>
    </div>
    <?php
}
Thewpse74395_use_filesystem 功能:

<?php
function wpse74395_use_filesystem()
{
    if(empty($_POST[\'save\']))
        return false;

    // can we do this?
    check_admin_referer(\'wpse74395-nonce\');

    // try to get the filesystem credentials.
    $url = wp_nonce_url(admin_url(\'options-general.php?page=wpse-filesystem\'), \'wpse74395-nonce\');
    if(false === ($creds = request_filesystem_credentials($url)))
    {
        // we didn\'t get creds...
        // The user will see a form at this point, so stop the
        // rest of the page.
        return true; 
    }

    // use WP_Filesystem to check initialize the global $wp_filesystem
    if(!WP_Filesystem($creds))
    {
        // didn\'t work, try again!
        request_filesystem_credentials($url);
        return true;
    }

    global $wp_filesystem;

    // get your file path
    $fp = WP_CONTENT_DIR . \'/test.txt\';

    // do your thing.
    if($wp_filesystem->exists($fp))
    {
        $res = $wp_filesystem->get_contents($fp);
        var_dump($res);
        return true;
    }

    // nothing worked, try again.
    return false;
}
这些评论应该有助于解释发生了什么。本质上:确保我们处于POST请求(表单提交)中,并且请求已签出(nonce验证)。从那里,我们将尝试获取文件系统凭据。如果我们没有得到任何,将显示一个表单来收集它们,因此请停止显示页面的其余部分。

仅通过给予request_filesystem_credentials 第一个论点,我们让WP决定我们需要使用什么方法。大多数情况下,这是直接的,用户不会看到任何东西。请注意request_filesystem_credentials 将尽一切可能在不询问用户的情况下获取这些内容--数据库选项、配置选项等。

一旦我们有了CRED,尝试初始化全局$wp_filesystem 对象具有WP_Filesystem. 如果成功了,太棒了!如果没有,请再次尝试获取凭据。

如果一切正常,请使用$wp_filesystem 如你所需。它们都有一个一致的接口。这是上面的代码in a plugin.

SO网友:Ralf912

WordPress不使用fopen(). WordPress文件系统使用四种方法访问文件:

  • file_get_contents() (方法直接)
  • 通过ftp类的套接字(方法ftpsockets)
  • 通过ftpftp_connect() / ftp_ssl_connect() (方法ftpext)ssh2通过ssh2_connect() (方法ssh2)
您必须使用fopen(). 当您使用wp_handle_upload(), WordPress应该清理并验证文件。$file[\'file\'] 应干净且可用。

结束

相关推荐

$wp_FILESYSTEM返回空。依赖关系是什么?

我需要获取对$wp\\u filesystem对象的引用。在下面的测试中,var\\u dump($wp\\u filesystem)返回NULL。要正确设置$wp\\U文件系统,还需要哪些其他文件?我一直在期待,因为它在文件中调用。php,加载该文件就足以加载该对象。<?php require(\'../../../wp-blog-header.php\'); require(\'../../../wp-admin/includes/file.php\'); $m