sae php 写文件权限,在新浪云搭建wordpress博客:解决uploads目录权限问题

由于新浪云不支持在代码目录进行IO操作,这意味着发表文章不能上传媒体文件。解决这个问题,就是将wordpress的uploads映射到SAE的Storage分布式文件存储服务。

1. 问题描述

尽管已经将wordpress本地源码上传到新浪云,也可以通过独立域名访问,详情见博文《在新浪云搭建wordpress博客:从本地源码到独立域名访问》,但使用过程会遇到一个严重问题,即没有uploads目录的写权限,比如在主题设置上传背景图像(上传到uploads目录),提示如下错误:

Unable to create directory wp-content/uploads/2015/04. Is its parent directory writable by the server?

2. 解决方法

由于SAE不支持IO操作,上传的代码目录没有写入权限[1],这意味着不能上传媒体文件,因为媒体文件存储目录是wordpress/wp-content/uploads/。SAE把IO操作交由MemcacheX、Storage分布式文件存储服务来做。那好,解决办法就是修改wordpress代码,将uploads映射到Storage。幸运的是,已有人分享了如何修改代码,见百度经验《WordPress中uploads目录替换为SAE的Storage方法》,摘抄如下:

(1)创建文件sae.php

在代码版本的根目录(注:不是应用目录)下创建文件sae.php,源码如下:

/* 在SAE的Storage中新建的Domain名,比如“wordpress” */

define ( 'SAE_STORAGE', wordpress );

/* 设置文件上传的路径和文件路径的URL,不要更改 */

define ( 'SAE_DIR', 'saestor://' . SAE_STORAGE . '/uploads' );

define ( 'SAE_URL', 'http://' . $_SERVER ['HTTP_APPNAME'] . '-' . SAE_STORAGE . '.stor.sinaapp.com/uploads' );

?>

(2)修改wp-includes/functions.php文件

/*** Step 1: include sae.php ***/

include( ABSPATH . '/sae.php' ); //添加这一行。调用SAE的Storage文件域名设置

require( ABSPATH . WPINC . '/option.php' ); //在这一行之前添加

/*** Step 2: 替换代码 ***/

/*

$wrapper = null;

// Strip the protocol.

if (wp_is_stream ( $target )) {

list ( $wrapper, $target ) = explode ( '://', $target, 2 );

}

// From php.net/mkdir user contributed notes.

$target = str_replace ( '//', '/', $target );

// Put the wrapper back on the target.

if ($wrapper !== null) {

$target = $wrapper . '://' . $target;

}

*/

//替换为以下代码

// from php.net/mkdir user contributed notes

if (substr ( $target, 0, 10 ) == 'saestor://') {

return true;

}

$target = str_replace ( '//', '/', $target );

/*** Step 3: 添加代码 ***/

$dir = SAE_DIR; //添加这一行

$url = SAE_URL; //添加这一行

$basedir = $dir;

/*** Step 4: 添加代码 ***/

//添加如下代码块

if ( !function_exists('utf8_encode') ) {

function utf8_encode($str) {

$encoding_in = mb_detect_encoding($str);

return mb_convert_encoding($str, 'UTF-8', $encoding_in);

}

}

//在这前面添加上述代码

/**

* Send a HTTP header to limit rendering of pages to same origin iframes.

*

* @since 3.1.3

*

* @see https://developer.mozilla.org/en/the_x-frame-options_response_header

*/

(3)修改wp-admin/includes/file.php

/*** 注释如下代码 ***/

// Set correct file permissions.

$stat = stat ( dirname ( $new_file ) );

$perms = $stat ['mode'] & 0000666;

@ chmod ( $new_file, $perms );

修改完成,再次提交代码,问题解决。关于新浪云Storage操作,可以参考官方文档的Storage部分。

3. 下载uploads内容

uploads是存在Storage,不能用git下载,进入Storage,也没有下载选项。下载uploads,需要安装Cyberduck,建立链接,操作示意图如下(详情见官方文档,这里):

3668a2b25f8eaf236377d73ae509e205.png

类型:Swift。

服务器:auth.sinas3.com

端口:443(默认)

用户名:应用AccessKey(在应用“汇总信息”页面中查看)

密码:应用SecretKey(在应用“汇总信息”页面中查看)

4. 其他问题

(1)svn … is already locked

提交代码时,若因“svn … is already locked”错误而不能提交。解决方法:右击项目 –> Team –> Refresh/Cleanup,然后再commit就可以了。

(2)The requested URL *** was not found on this server

访问非主页页面时,提示如下错误:

Not Found

The requested URL /just-for-test/ was not found on this server.

解决方法,在config.yaml文件添加如下两行,重新提交代码[2]:

handle:

- rewrite: if (!is_file() && !is_dir() && path ~ "^/(.*)") goto "index.php/$1"

赞赏

55729a69d32f0f0822e388c02739b327.png微信赞赏a47faba0949a8e374782be70008efbd1.png支付宝赞赏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值