CentOS下搭建支持中文路径的ftp文件服务器(Apache+PHP+ProFtp+H5ai)
2020-03-19 09:18:49


近期,一个项目中需要搭建一资源/文件服务器。需求如下:

1.Ftp上传下载,支持客户端软件及windows视图访问

2.Web访问下载,需有图片预预览功能。

3.服务器要求极端稳定和安全

针对上述需求,研究后决定采用Linux系统来实施该项目方案。

安装CentOS 6.3后,利用VsFtp实施该方案后,发现VsFtp对中文路径的支持非常差。特别是对于利用Windows视图,如在文件资源浏览窗口输入ftp://serverIp后,中文均变成乱码。搜索一堆资料,发现实施很困难,决定放弃VsFtp,改用ProFtp来重新构建。

步骤:(注:Apache&Php在CentOS中已内置,本例是采用完全安装再定制启动服务的方法。至于Apache及Php的设置,由于篇幅关系,请参阅网上其它资料。本例中Apache采用的是GBK编码)

1.移除或禁启动VsFtp

2.下载ProFtp 1.3.4rc3

3.安装ProFtp

 安装方法:

cd /tmp
wget http://www.lerx.com/download/linux/proftpd-1.3.4rc3.tar.gz
tar zvxf proftpd-1.3.4rc3.tar.gz
cd proftpd-1.3.4rc3
./configure --prefix=/usr/local/proftpd --enable-nls
make
make  install
make clean

 安装后,将ProFtp设置为系统服务。

cd proftpd-1.3.4rc3/contrib/dist/rpm
cp proftpd.init.d /etc/rc.d/init.d/proftpd
chmod 755  proftpd.init.d
chkconfig --add proftpd
service proftpd start

发现用户组问题,打开 ProFtp 配置文件修改

vi /usr/local/proftpd/etc/proftpd.conf

将Group的值 改为nobody,如下:

# Set the user and group under which the server will run.
User                            nobody
Group                           nobody
DefaultRoot ~

# Normally, we want files to be overwriteable.
AllowOverwrite          on
AllowRetrieveRestart on
AllowStoreRestart on

DefaultRoot ~ 指将用户限制在用户主目录内。下面的配置是加入了断点续传的支持。

在ProFtp配置文件中加入服务器与客户端自动适应字符集编码的支持。

 

UseEncoding local-charset client-charset


重启动ProFtp,经测试,在CuteFtp客户端或Windows视图新建中文路径及上传中文名文件,包括利用Web浏览,均正常。

至此Ftp服务安装结束。

由于客户需要图片预览功能,而Apache并不支持。可能修改Apache的一些配置或文件能达到,但如果在目录列表中将文件的缩略图都显示出来,那是一定需要进行开发。原因是如果利用HTML中的图片元素进行限制图片尺寸来显示,那一定是非常耗费资源的一种做法。比如,一个目录里可能存在几千几万个图片,这些图片可能每个都是几MB或十几MB,那这个图片列表出来的速度将会是慢得惊人,对服务器的影响也是巨大的。因此决定采用点击图片文件名查看该图片的做法。

经过搜索,发现老外的一个东西不错,这就是H5ai。

安装很简单,到官网下载,有英文的安装说明。

根据我的情况,配置有两种方法,一种是Php支持的做法,另一种是Php不支持的做法。我的是支持Php的,就用第一种吧。修改将下载后的H5ai解包,上传_h5ai至网站的根目录下。

然后测试:

输入http://yourIp/_h5ai ,出现测试界面

 

 

 

 显示服务器的环境支持,上图显示php和image是支持的。按官网的说明修改Apache的配置文件httpd.conf文件。

DirectoryIndex index.html index.html.var index.php  /_h5ai/server/php/index.php

重启Apache,发现已能按官网的说明显示目录和文件了。但此时发现一个严重的问题,即中文目录及文件均是乱码,即是百分号编码。

网上搜索H5ai资料,竟然没有。只有自己研究了。配置文件发现不到异常,也没有配置的选项。

在右键查看网页源码的时候,发现了一个有趣的东西。

<!DOCTYPE html><!--[if lt IE 9]><html class="no-js oldie" lang="en"><![endif]--><!--[if gt IE 8]><!--><html lang="en" class="no-js"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><title>index 路 styled with h5ai 0.22.1 (http://larsjung.de/h5ai/)</title><meta name="description" content="index styled with h5ai 0.22.1 (http://larsjung.de/h5ai/)"><meta name="viewport" content="width=device-width"><link rel="shortcut icon" href="/_h5ai/client/images/app-16x16.ico"><link rel="apple-touch-icon" type="image/png" href="/_h5ai/client/images/app-48x48.png"><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic,700italic|Ubuntu:400,700,400italic,700italic"><link rel="stylesheet" href="/_h5ai/client/css/styles.css"><script src="/_h5ai/client/js/scripts.js" data-mode="php"></script></head><body id="h5ai-main"><div id="topbar" class="clearfix"><ul id="navbar"></ul></div><div id="content"><div id="extended" class="clearfix"></div></div><div id="bottombar" class="clearfix"><span class="left"><a id="h5ai-reference" href="http://larsjung.de/h5ai/" title="h5ai 路 a modern HTTP web server index">h5ai 0.22.1</a><span class="hideOnJs noJsMsg">鈿?JavaScript is disabled! 鈿?/span><span class="oldBrowser">鈿?Some features disabled! Works best in <a href="http://browsehappy.com">modern browsers</a>. 鈿?/span></span><span class="right"></span><span class="center"></span></div><div id="data-generic-json" class="hidden">{"entries":[{"absHref":"\/","time":1355304140000,"size":11065261,"test":null,"status":200,"content":false},{"absHref":"\/files\/","time":1355309684000,"size":9937735,"test":null,"status":"=h5ai=","content":true},{"absHref":"\/files\/film\/","time":1355319999000,"size":8192,"test":null,"status":"=h5ai=","content":false},{"absHref":"\/files\/music\/","time":1355236136000,"size":4096,"test":null,"status":"=h5ai=","content":false},{"absHref":"\/files\/%B2%E2%CA%D4\/","time":1355384869000,"size":16384,"test":null,"status":"=h5ai=","content":true},{"absHref":"\/files\/%B2%E2%CA%D4\/Lerx%B2%E2%CA%D4%CA%D3%C6%B5\/","time":1355384869000,"size":4096,"test":null,"status":"=h5ai=","content":false},{"absHref":"\/files\/%B2%E2%CA%D4\/Lerx%C8%ED%BC%FE%D7%CA%C1%CF\/","time":1355384843000,"size":4096,"test":null,"status":"=h5ai=","content":false},{"absHref":"\/files\/%B2%E2%CA%D4\/Lerx%D1%A7%CF%B0%BD%CC%B3%CC\/","time":1355384853000,"size":4096,"test":null,"status":"=h5ai=","content":false},{"absHref":"\/files\/%B3%CC%D0%F2\/","time":1355236099000,"size":4096,"test":null,"status":"=h5ai=","content":false},{"absHref":"\/files\/%D5%D5%C6%AC\/","time":1355236306000,"size":9896766,"test":null,"status":"=h5ai=","content":false},{"absHref":"\/files\/%D7%CA%C1%CF\/","time":1355236114000,"size":4096,"test":null,"status":"=h5ai=","content":false}]}
</div><div id="data-php-no-js-fallback" class="hideOnJs"><table><tr><th></th><th><span>Name</span></th><th><span>Last modified</span></th><th><span>Size</span></th></tr><tr><td><img src="/_h5ai/client/icons/16x16/folder-parent.png"/></td><td><a href="..">Parent Directory</a></td><td></td><td></td></tr><tr><td><img src="/_h5ai/client/icons/16x16/folder.png"/></td><td><a href="/files/%B2%E2%CA%D4/Lerx%B2%E2%CA%D4%CA%D3%C6%B5/">Lerx测试视频</a></td><td>2012-12-13 07:47</td><td>4 KB</td></tr><tr><td><img src="/_h5ai/client/icons/16x16/folder.png"/></td><td><a href="/files/%B2%E2%CA%D4/Lerx%C8%ED%BC%FE%D7%CA%C1%CF/">Lerx软件资料</a></td><td>2012-12-13 07:47</td><td>4 KB</td></tr><tr><td><img src="/_h5ai/client/icons/16x16/folder.png"/></td><td><a href="/files/%B2%E2%CA%D4/Lerx%D1%A7%CF%B0%BD%CC%B3%CC/">Lerx学习教程</a></td><td>2012-12-13 07:47</td><td>4 KB</td></tr></table></div></body></html>

源码中竟然没有文件名这样一个独立的属性。经过分析,原来老外是取的文件的地址和路径放入json,然后利用Javascript将文件的地址中的路径清除就变成了文件名。如:

/pic/lerx/test1.doc,老外取了两个属性,absHref=/pic/lerx/,即文件路径,还有文件地址即/pic/lerx/test1.doc,javascript处理将/pic/lerx/清除,文件名就出来了。晕,这搞法啊。这老外,水平高是很高,99%的高,1%的菜。英文及数字当然没问题,就是没想到咱中国人嘛!就是想不到咱中国人,还有其它什么韩国日本等等的家伙呢。

其实取文件并不复杂,Apache的目录浏览,中文不都出来了吗?路径是百分号编码。

现在只有改H2ai的源码了,经过分析,证实了我对老外的做法猜想的正确性。网上js解压(有些解压不成功,显示不正常),一大堆代码,懒得用心去改,想了个最简单的做法,就是让它生成文件名的时候再把它转回去不就OK了嘛?

再找个GBKURLDecode转回去就行了。修改js代码,上传,大告成功。效果图如下:

  最后附上修改过的H5ai让大家共享,也许本资料是国内第一个H5ai的资料,请多多支持Lerx项目的开发。说明:关键在压缩包中的h5ai-0.22.1\_h5ai\client\js文件夹中的scripts.js,原版压缩版本附上。unic-gbk.js是网上找的,代码已复制进scripts.js,出于对原开发者的尊重,一并附上,实际使用可以删除。


点此下载修改过的H5ai

发布:lzh