讀出局域網其他服務器的共享目錄並通過php顯示目錄樹
有兩個服務器, A,B,在一個局域網內。
A, 192.168.1.20
B, 192.168.1.21
A 服務器是共享服務器,安裝了smb, 在/home/share目錄下,大家可以通過smb://192.168.1.20/public 訪問到共享目錄,平常把一些文件,從自己的電腦直接復制到共享服務器的共享目錄下。
B 服務器是項目服務器,安裝了 lnmp。
現在B服務器上有TP項目,名稱oa,放在/data/wwwroot/oa下的,需要後臺某個頁面,顯示A服務器共享目錄的目錄和文件樹,並能下載需要的文件。
解決方法。
- 將A服務器的共享目錄映射到B服務器的目錄。比如同樣的:/home/share
- Nginx配置中設置 一個別名目錄,/share 對應 /home/share . 相當於 /home/share 又映射到 /data/wwwroot/oa/public/share
3 . 編寫功能代碼。
服務器
具體做法。
-
A服務器已經安裝samba服務,B服務器安裝samba服務。
A服務器中,smb的設置:
vi /etc/samba/smb.conf
有這一段:
# A publicly accessible directory, but read only, except for people in # the "staff" group [public] comment = Public Stuff path = /home/share public = yes writable = yes printable = no write list = +staff
下面圖示B服務器安裝samba
yum install samba
chkconfig -- add smb
chkconfig -- add nmb
/sbin/service smb start
/sbin/service nmb start
掛載:試了幾次才成功。
mount -t smbfs -o username=root,password=****** //192.168.1.20/home/share /home/share mount: unknown filesystem type ‘smbfs‘ mount -o username=root,password=****** //192.168.1.20/home/share /home/share mount: //192.168.1.20/home/share is not a valid block device
上面兩句是錯誤的,下面這句才是對的。
mount -o username=root,password=****** //192.168.1.20/public /home/share
之後,我們看B服務器的/home/share目錄下就有了。
2.在B服務器的/usr/loccal/nginx/conf/vhost/***.conf
該網站相應配置文件中,
添加如下幾行:
location /share/{
internal;
alias /home/share/;
}
3.程序代碼部分:
/**
* 展開目錄樹
*/
public function share_list($dirname=‘‘){
if(!$dirname){
$dirname = ‘/home/share/’;
}
$tree = $this->listDir($dirname);
$this->assign(‘tree‘,$tree);
$this->setMeta(‘文件列表‘);
return $this->fetch();
}
/**
* 根據文件鏈接下載本地文件
*/
public function download($filepath=‘‘){
// 提取文件名:
$name_arr = explode(‘/‘,$filepath);
$savename = $name_arr[count($name_arr)-1];
LogService::write(‘內部共享‘, $content = "下載",0,$filepath);
header("Content-Disposition: attachment; filename= ".$savename."");
header("Content-Type: application/octet-stream");
ob_clean(); #清空輸出緩沖區
flush(); #刷新輸出緩沖:
header("X-Accel-Redirect: ".$filepath."");
header("X-Accel-Buffering: yes");
}
/**
* 列出服務器上的目錄樹
*
*/
public function listDir($dirname=‘uploads‘){
static $str = ‘‘;
if(!is_readable($dirname)){
// 如果目錄設置為不可讀,則打不開。
}else{
$Ld= dir($dirname);
$str .= "<ul>";
while(false !== ($entry= $Ld->read())) {
$checkdir=$dirname."/".$entry;
if(is_dir($checkdir) && !preg_match("[^\.]",$entry)){
$str .="<li>".$entry."<small>??(目錄)</small>";
$this->listDir($checkdir);
$str .="</li>";
}elseif(preg_match("[^\.]",$entry)){
}else{
$filepath = str_replace(‘/home/share/’,’/share‘,$checkdir);
$url = url(‘admin/localnet/download‘,array(‘filepath‘=>$filepath));
$str .="<li>".$entry. "??<a href=‘{$url}‘>下載</a></li>";
}
}
$Ld->close();
$str .="</ul>";
return $str;
}
}
頁面文件就參考這個:
一個簡單的可折疊展開的樹形目錄
https://www.cnblogs.com/dige1993/p/5985771.html
效果:
如果還有不明白,可加我的 QQ:2998658517 。
其他參考:
linux系統下掛載局域網內其他操作系統的目錄
https://blog.csdn.net/u012272186/article/details/81010407
用mount掛載遠程服務器網絡硬盤
https://blog.csdn.net/coolwubo/article/details/60779933?utm_source=blogxgwz2
如何在linux上安裝配置samba服務器
https://zhidao.baidu.com/question/1114841412106803419.html
Linux中配置samba服務器,實現局域網中文件共享
http://blog.51cto.com/13760226/2139355
一個簡單的可折疊展開的樹形目錄
https://www.cnblogs.com/dige1993/p/5985771.html
分辨服務器是linux系統還是Windows系統
通過ping命令測試,查看返回的TTL值。TTL=128,這是WINNT/2K/XP。 TTL=32,這是WIN95/98/ME,TTL=256,這是UNIX。 TTL=64,這是LINUX。
讀出局域網其他服務器的共享目錄並通過php顯示目錄樹