幻蓝博客 – 孤月蓝风

追寻互联网科技、Unity开发、AR/VR开发、游戏开发、Web前后端开发等技术。

Emlog for BAE修改教程,支持附件上传(云存储)等


Ps.2013.12.03  Emlog 5.2 For BAE 已经发布

请猛戳 -> Emlog For BAE 发布专文

本文不再更新,所有更新均发布在上面的地址中

——————————————-

Ps.2013.12.02  Emlog 5.2 BAE正在移植

Ps.2013.12.02  官方5.2已发布,BAE版正在开发中。本版将修改原来的BCS存储为PCS存储,能够更方便的管理上传的文件,敬请期待!

Ps:官方的Emlog 5.2即将发布,发布之后我会出一个完整的BAE版本,不再需要这么麻烦的修改代码。只修改几个配置就搞定,然后打包上传就可以了。敬请期待!

这个是我亲测的5.1.2完全正常,不知道为什么有很多朋友的都不行,由于5.2即将发布,所以暂不做更新,待5.2发布后再更新新版本。

本修改基于EMLOG 5.0.1版本,其他版本未测试。一般来说是不会出问题,除非EMLOG大版本升级。

PS:2013.07.24   教程更新,亲测5.1.2可用。

PS:2013.07.12   修改第二部分附件上传第41、42行的代码,之前不知道什么问题,也是个人疏忽,导致代码中多了两个单引号,造成无法上传,现已修正。感谢  VIP下页、下一 的反馈。

之前写过一篇文章,《BAE版的EMLOG已完工!》,后来EMLOG又升级了几次,外加微博通的同步一直搞不定,所以就暂时搁浅了。

现在我的博客(已经不能单纯的算博客了,算个网站),是我自己基于taoCMS二次开发的,对BAE的支持更好,也搞定了很多BAE上存在的问题。所以,EMLOG也就没继续用。现在这个博客稳定了,又有闲暇时间,所以跟大家分享一下,EMLOG for BAE的修改方法。

BAE上的EMLOG,最好是本地已经配置好的,然后将本地配置完成的打包上传即可。数据库也在本地备份,然后通过BAE的PMA导入。

先下载BCS(百度云存储,用于存储附件)的SDK放在admin目录中。

下载地址:http://bcs.duapp.com/bcs-api/bcs-sdk-php_1.2.tar.gz

一、本地安装EMLOG,并将一切设置OK,如原有博客,请将数据恢复到本地。

二、按照下面的提示修改文件(因版本升级,所以可能导致我写的行号不对,大家可以查找一下被替换的代码,来确定行号)

1.配置文件

在上传到BAE之前,需要先修改配置文件,因为BAE是不支持I/O读写的,所以需要在配置文件中手动加上BAE数据库信息的获取方式。

$dbname = '';        //填入自己的数据库名称
$host = getenv('HTTP_BAE_ENV_ADDR_SQL_IP');
$port = getenv('HTTP_BAE_ENV_ADDR_SQL_PORT');
$user = getenv('HTTP_BAE_ENV_AK');
$pwd = getenv('HTTP_BAE_ENV_SK');

之后,将下面的数据库信息其中四条修改为:

define('DB_HOST',$host.':'.$port);
define('DB_USER',$user);
define('DB_PASSWD',$pwd);
define('DB_NAME',$dbname);

这样,完成了最新本的数据库配置。

2.附件上传

打开admin目录下的attachment.php文件,第41行(5.1.2中为第43行)左右的代码:

//写入附件信息
$query="INSERT INTO ".DB_PREFIX."attachment (blogid,filename,filesize,filepath,addtime) values ($logid,'".$attach['name'][$i]."','".$attach['size'][$i]."','".$upfname."','".time()."')";

修改为:

$bcs_upfname = str_replace('..', '', $upfname);
//将文件上传至BAE云存储
require_once './bcs.class.php';
$host = 'bcs.duapp.com';
//bucket的ak
$ak = '';
//bucket的sk
$sk = '';
//bucket名称
$bucket = '';
$object = $bcs_upfname;    //这个是上传后文件的名字
$fileUpload = $upfname;    //这个是需上传的文件的名字
$baiduBCS = new BaiduBCS ( $ak, $sk, $host );
$response = $baiduBCS->create_object ( $bucket, $object, $fileUpload );
if (! $response->isOK ()) {
    die ( "文件上传失败!" );
}
$bcs_url = $baiduBCS->generate_get_object_url($bucket, $object, $opt = array());
//百度云附件信息写入数据库
$query="INSERT INTO ".DB_PREFIX."attachment (blogid,filename,filesize,filepath,addtime) values ($logid,'".$attach['name'][$i]."','".$attach['size'][$i]."','".$bcs_url."','".time()."')";

打开admin/views目录下的attlib.php文件,第32行代码:

$atturl = BLOG_URL.substr(str_replace('thum-','',$value['filepath']),3);

修改为

if (strpos($value['filepath'],'bcs.duapp.com') != false) { 
    $atturl = $value['filepath']; 
} else { 
    $atturl = BLOG_URL.substr(str_replace('thum-','',$value['filepath']),3);        
}

第41、42行(5.1.2中为45,46行)

$imgpath = "./views/images/fnone.gif";
$embedlink = "插入 ";

修改为:

if (strpos($value[‘filepath’],’duapp’) != false) {
$imgpath = $value[‘filepath’];
$ed_imgpath = urlencode($imgpath);
$embedlink = "插入 ";
} else {
$imgpath = "./views/images/fnone.gif";
$embedlink = "插入 ";
}


这一块儿网页输出显示的不正确,一直解决不了,只好放一张截图了。

3.修改博客地址,在EMLOG后台->设置->博客地址,然后打开根目录下的 init.php 文件,修改 define(‘BLOG_URL’, Option::get(‘blogurl’)); 这一行中后面的 Option::get(‘blogurl’) 为 ‘你的地址’ (地址两边加单引号,例如:http://tremlog.duapp.com/)


4.删除 content/cache 目录下,所有文件


三、所有修改完毕后,用本地的 Phpmyadmin 导出数据库(因为之前数据库已修改为BAE方式,所以不能通过后台导出),之后在BAE的 phpmyadmin 上导入。


四、BAE版EMLOG的伪静态设置

BAE上的伪静态设置,请参考:《BAE版EMLOG的伪静态设置

EMLOG在BAE上的修改基本就是这些了,如果发现有什么问题,也可以留言询问。


Windows Server 2008上,PHP环境一键配置


简介:

这是一个在Windows Server 2008上使用的PHP环境一键配置安装包。

里面的PHP环境一键配置安装工具,是西部数码的,我只是借用了一下。同时,将一些服务器上很有用的工具一并打包了起来。

最根本的原因是:西部数码的下载速度最多到400K/S,所以我把他挪到了百度网盘上。

打包软件及说明:

西部数码网站管理工具:西部数码这个管理工具,还是很好用的,一键配置环境,配置伪静态,配置各种。

Sublime Text 2:有时候修改一些网站源码什么的,直接在服务器改很省事,懒得FTP了,所以里面有了Sublime Text 2 编辑器。

FileZilla:有时需要从旧的服务器下载一些文件,所以有了这个。

Opera:有时候需要访问某些网站,但是自带的IE有安全设置,太过于繁琐,所以有了Opera,为什么不是火狐?因为Opera安装包最小。

HeiDiSQL:经常需要进入数据库改一些东西,PMA?太麻烦了,所以,你懂得。

Flash:这个是我在服务器上,往百度网盘上传的时候安装的,不安装FLASH无法上传,很多网站的上传也都如此,但是,不建议安装。

下载地址:

WS2008服务器套装点这里

打包软件单独下载点这里


BAE版EMLOG的伪静态设置


BAE上设置伪静态很简单

导航栏“管理中心” -> 左侧“应用管理” -> 左侧“全部” -> 右侧点击自己的应用

左侧“云环境” -> 右侧版本列表最右端“高级” -> 鼠标移上去 -> 配置

右侧添加

1.规则类型:URL

2.规则:/blog/post-.*.html

3.执行:/blog/index.php

Ps:因为我的博客放在blog目录下,所以加 blog/ 如果在根目录则不用加,为:/post-.*.html 第三条同理

依次添加所有规则即可,只更换第二条“规则”,例如 /blog/sort/等,第三条不变

添加完成后,请点击保存

 

 


BAE版的EMLOG已完工!


经历了XX个日日夜夜,BAE版的EMLOG终于完工!基本所有功能正常使用,暂时没有发现其他问题。

点击查看Emlog最新版本 -> 

Emlog For BAE 持续更新链接(点我。点我)

成功解决问题:

1.上传图片功能(使用百度BCS云存储服务)

2.伪静态功能(使用百度云环境自带功能)

仍存在的问题:

1.现在似乎所有文件都能上传,但是对非图片附件,没有进行URL处理,导致链接不正确

2.上传图片,暂时只能一张一张上传,批量上传功能我还没用到,所以不知道有没有问题

其他问题:

暂时没有发现其他问题

 

暂时仅供自己测试,随后看情况是否放包。

很多免费空间或者云空间被滥用,导致各种被封,所以在慎重考虑是否将此包外放。随后会提供教程版~~~

已提供安装版本:

Emlog For BAE 发布,查看文章顶部链接

 

此博客搭建没多长时间,也不知道写出这个文章后人气会不会增加~~~期待,哈哈

 

跟进:

13.05.13   发现微博通无法同步,不知道是不是BAE的原因,等有时间了解决

13.05.13   记得网上见人说BAE会和Appfog一样,不定期清理非代码包文件(具体叫什么,我也不知道……就是通过php文件上传到云环境而非云存储的文件),所以更换主题后,过段时间可能就消失了。


【C#】通过Process来对系统进程进行操作


今天想自己写一个程序,来获取当前某项进程的命令行参数,以后也就不用打开任务管理器,然后一个字母的敲了,可是到最后都没有找到办法。

关于系统进程的获取、启动和停止,都已经搞定了。

本来可以很简单的,但是我弄复杂了点,顺带把多维数组温习了一遍。

下面是获取进程列表的代码:

using System.Diagnostics;
  
         private void button1_Click(object sender, EventArgs e)
         {
             listBox1.Items.Clear();
             listBox2.Items.Clear();
             Process[] liebiao = Process.GetProcesses();
             string[,] shuzu_jincheng = new string[liebiao.Length,2];
             int i = 0;
             foreach (Process jincheng in liebiao)
             {
                 shuzu_jincheng[i, 0] = jincheng.Id.ToString();
                 shuzu_jincheng[i, 1] = jincheng.ProcessName;
                 i++;
             }
             for (i = 0; i < liebiao.Length - 1; i++)
             {
                 listBox1.Items.Add(shuzu_jincheng[i, 0]);
                 listBox2.Items.Add(shuzu_jincheng[i, 1]);
             }
         }

这个也需要一个引用,代码第一行就是需要进行引用的类。

关于进程的操作,MSDN上都有(除了获取命令行参数,能获取的只有通过Process.start()启动的进程)。又关结束进程等的操作,可以直接去MSDN学习,我也就不贴代码了。


【C#】关于生成快捷方式的技术问题


做ASP.NET迷你服务器时,最后突然想到如果能够增加一个保存快捷方式的功能的话,以后直接打开服务器,并且设定好一切都会很方便,于是就在MSDN上寻找相关技术文章与教程,最后一无所获,无奈下只能上网找资料了。

最后成功的找到了相关的文章,通过代码了解了生成快捷方式这个技术需要使用Win32API,最后又通过反复试验,最终搞定。

下面是生成快捷方式的代码:

private void label_sckjfs_Click(object sender, EventArgs e)
         {
             JiaoYan();
             if (tingzhi == "true")
             {
                 tingzhi = "";
                 return;
             }
             string path_zhuomian = "";
             RegistryKey key = Registry.CurrentUser;
             //打开对应的注册表项,并获取Desktop键的值,这个是用来寻找桌面路径。
             path_zhuomian = key.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders").GetValue("Desktop").ToString();
             path_zhuomian = path_zhuomian + "\";
             try
             {
                 //生成WshShell的实例
                 WshShell shell = new WshShell();
                 //CreatShortcut中的参数是生成快捷方式的目录及文件名
                 IWshShortcut kjfs = (IWshShortcut)shell.CreateShortcut(path_zhuomian + TB_KJFS.Text + ".lnk");
                 //快捷方式的目标路径:生成哪个文件的快捷方式,就是哪个文件的目录加文件名
                 kjfs.TargetPath = lujing + banben;
                 //快捷方式的启动参数
                 kjfs.Arguments = canshu;
                 //快捷方式的备注(描述)
                 kjfs.Description = "";
                 //快捷方式的工作目录,就是源程序的目录,和目标路径的目录一样
                 kjfs.WorkingDirectory = @"C:Program FilesCommon Filesmicrosoft sharedDevServer10.0";
                 //快捷方式的图标,我还不知道怎样能直接使用ico图标,以及使用当前程序的图标
                 kjfs.IconLocation = "iscsicli.exe,0";
                 //快捷方式的快捷键
                 kjfs.Hotkey = "";
                 //快捷方式的样式
                 kjfs.WindowStyle = 1;
                 //保存快捷方式
                 kjfs.Save();
                 MessageBox.Show("快捷方式生成成功。");
             }
             catch
             {
                 MessageBox.Show("未知错误!");
             }
         }

以上就是生成快捷方式的方法,需要引用一个COM组件,Interop.IWshRuntimeLibrary.dll

引用之后就可以使用上面的代码来生成快捷方式了。


【C#】调用外部程序(带命令行参数)


以下代码能够从C#调用外部程序,并且能为程序添加命令行参数。

1 System.Diagnostics.Process.Start( string 参数1 , string 参数2 );

参数1:所需调用程序的所在目录及文件名

参数2:运行程序所需要加的命令行参数

两个参数均为字符串类型。


【C#】通过正则表达式对TextBox进行校验


以下代码使用了 .NET Framework 正则表达式,使用正则表达式来对TextBox框内的内容进行判断与校验。

//检测虚拟路径的正确性
 private void TB_XNLJ_Leave(object sender, EventArgs e)
 {
     if (System.Text.RegularExpressions.Regex.IsMatch(TB_XNLJ.Text, "^/[^\:*?"<>|]*$"))
     {
         string dizhi = "http://localhost";
         linkLabel_dizhi.Text = dizhi + TB_XNLJ.Text;
     }
     else
     {
         MessageBox.Show("虚拟目录格式不正确,已重置。nn文件夹名称中不能包含:  \ : * ? " < > | 这些字符。");
         TB_XNLJ.Text = "/";
     }
 }

【C#】判断目录下文件是否存在


下面代码中,新建了一个 DirectoryInfo 对象,然后使用遍历来判断文件是否存在。这种方法很笨,但是我还没想到、也没有机会上网查好方法,所以暂时先这样。

//窗体加载时检测是否安装有本程序所需调用的文件,若有则加入下拉列表
         private void Form_Zhu_Load(object sender, EventArgs e)
         {
             string path = "C:\Program Files\Common Files\microsoft shared\DevServer\10.0\";
             DirectoryInfo netdir = new DirectoryInfo(path);
             FileInfo[] fl = netdir.GetFiles();
             foreach (FileInfo netfl in fl)
             {
                 if (netfl.Name == "WebDev.WebServer20.EXE")
                 {
                     CB_BanBen.Items.Add(".NET Framework 2.0");
                 }
                 if (netfl.Name == "WebDev.WebServer40.EXE")
                 {
                     CB_BanBen.Items.Add(".NET Framework 4");
                 }
             }
             if (CB_BanBen.Items.Count < 1)
             {
                 MessageBox.Show("没有在您的电脑上找到能够启用本程序的文件,程序退出。");
                 Application.Exit();
             }
              
         }

【C#】获取项目程序路径的方法


Application.StartupPath

获取当前应用程序所在目录的路径,不包含文件名,最后不包含“”

Application.ExecutablePath

获取当前应用程序文件的路径,包含文件名