[Php] Aria2文件管理項目,實現文件下載後的增刪改查、在線瀏覽與分享等功能


Aria2+AriaNG搭建的下載機,在文件下載後往往需要通過遠程登陸服務器的方式實現文件的操作,往往不夠方便。通過掛載至Nextcloud、OneDrive、Google Drive等形式訪問文件又由於無777權限而無法實現文件的真正管理。因此我嘗試基於Aria2+AriaNG搭建的下載機,開發了一個文件管理平臺,實現了下載文件後的增刪改查、在線瀏覽與分享等功能。

演示:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


文件結構:

root
└── .aria2
    ├── aria2.conf
	├── aria2.log
	└── aria2.session

/www/wwwroot/your_domain
├── AriaNg全部文件
└── down
    └── 文件管理

(1)安裝Aria2

uname -a    #查看系統版本信息

首先找到適合自己系統的最新版的Aria2靜態文件:查看地址
如:x86-64 就應該下載x64版本,即64bit

wget https://github.com/q3aql/aria2-static-builds/releases/download/v1.34.0/aria2-1.34.0-linux-gnu-64bit-build1.tar.bz2

tar jxvf aria2-*.tar.bz2 && rm -rf aria2-*.tar.bz2 && cd aria2-*

make install

##如果安裝的時候提示-bash: make: command not found錯誤,需要先運行命令:
Debian/Ubuntu系統:apt install make -y
CentOS系統:yum install make -y

這時候就安裝好了,可使用aria2c -v查看版本信息。


(2)配置下載機前端

  1. 新建站點,創建down文件夾,將開發完成的前端文件放置down文件夾中
  2. data文件777權限
  3. 預設下載目標文件夾,設置777權限(重要,以確保下載的文件能夠被全權管理)

/www/wwwroot/your_domain/down/data/User/admin/home/下載文件/

chmod -Rf 777 ./*
或者
chmod 777 /www/wwwroot/your_domain/down/data/User/admin/home/下載文件/*

修改默認權限:(umask)

[root@localhost tmp]# vim /etc/bashrc
[root@localhost tmp]# vim /etc/profile

兩個文件的內容是一樣的
搜索umask,找到如下代碼,不算第一位的特殊權限

if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
   umask 0000	//表示uid大於等於199的默認umask值,表示普通用戶
else
   umask 0000	//表示uid小於199的默認umask值,表示root
fi

修改後需要重新讀取一下/etc/bashrc或/etc/profile
[root@lewis ~]# source /etc/profile
[root@lewis ~]# source /etc/bashrc

(3)配置Aria2

在這裏插入圖片描述

1. aria2.conf
mkdir /root/.aria2/

vi /root/.aria2/aria2.conf

dir= /www/wwwroot/your_domain/down/data/User/admin/home/下載文件/

#允許rpc  
enable-rpc=true  
#允許所有來源, web界面跨域權限需要  
rpc-allow-origin-all=true  
#允許非外部訪問  
rpc-listen-all=true

## '#'開頭爲註釋內容, 選項都有相應的註釋說明, 根據需要修改 ##
## 被註釋的選項填寫的是默認值, 建議在需要修改時再取消註釋  ##

## 文件保存相關 ##

# 文件的保存路徑(可使用絕對路徑或相對路徑)#################################此處需要修改
dir=
# 啓用磁盤緩存, 0爲禁用緩存, 需1.16以上版本, 默認:16M
#disk-cache=32M
# 文件預分配方式, 能有效降低磁盤碎片, 默認:prealloc
# 預分配所需時間: none < falloc ? trunc < prealloc
# falloc和trunc則需要文件系統和內核支持
# NTFS建議使用falloc, EXT3/4建議trunc, MAC 下需要註釋此項
# file-allocation=none
# 斷點續傳
continue=true

## 下載連接相關 ##

# 最大同時下載任務數, 運行時可修改, 默認:5
max-concurrent-downloads=10
# 同一服務器連接數, 添加時可指定, 默認:1
max-connection-per-server=5
# 最小文件分片大小, 添加時可指定, 取值範圍1M -1024M, 默認:20M
# 假定size=10M, 文件爲20MiB 則使用兩個來源下載; 文件爲15MiB 則使用一個來源下載
min-split-size=10M
# 單個任務最大線程數, 添加時可指定, 默認:5
split=20
# 整體下載速度限制, 運行時可修改, 默認:0
#max-overall-download-limit=0
# 單個任務下載速度限制, 默認:0
#max-download-limit=0
# 整體上傳速度限制, 運行時可修改, 默認:0
max-overall-upload-limit=1M
# 單個任務上傳速度限制, 默認:0
#max-upload-limit=1000
# 禁用IPv6, 默認:false
disable-ipv6=false

## 進度保存相關 ##

# 從會話文件中讀取下載任務
input-file=/root/.aria2/aria2.session
# 在Aria2退出時保存`錯誤/未完成`的下載任務到會話文件
save-session=/root/.aria2/aria2.session
# 定時保存會話, 0爲退出時才保存, 需1.16.1以上版本, 默認:0
save-session-interval=60

## RPC相關設置 ##

# 啓用RPC, 默認:false
enable-rpc=true
# 允許所有來源, 默認:false
rpc-allow-origin-all=true
# 允許非外部訪問, 默認:false
rpc-listen-all=true
# 事件輪詢方式, 取值:[epoll, kqueue, port, poll, select], 不同系統默認值不同
#event-poll=select
# RPC監聽端口, 端口被佔用時可以修改, 默認:6800
rpc-listen-port=6800
# 設置的RPC授權令牌, v1.18.4新增功能, 取代 --rpc-user 和 --rpc-passwd 選項
#rpc-secret=
# 設置的RPC訪問用戶名, 此選項新版已廢棄, 建議改用 --rpc-secret 選項
#rpc-user=<USER>
# 設置的RPC訪問密碼, 此選項新版已廢棄, 建議改用 --rpc-secret 選項
#rpc-passwd=<PASSWD>
# 是否啓用 RPC 服務的 SSL/TLS 加密,
# 啓用加密後 RPC 服務需要使用 https 或者 wss 協議連接
#rpc-secure=true
# 在 RPC 服務中啓用 SSL/TLS 加密時的證書文件(.pem/.crt)
#rpc-certificate=/root/xxx.pem
# 在 RPC 服務中啓用 SSL/TLS 加密時的私鑰文件(.key)
#rpc-private-key=/root/xxx.key

## BT/PT下載相關 ##

# 當下載的是一個種子(以.torrent結尾)時, 自動開始BT任務, 默認:true
follow-torrent=true
# BT監聽端口, 當端口被屏蔽時使用, 默認:6881-6999
listen-port=51413
# 單個種子最大連接數, 默認:55
#bt-max-peers=55
# 打開DHT功能, PT需要禁用, 默認:true
enable-dht=true
# 打開IPv6 DHT功能, PT需要禁用
#enable-dht6=false
# DHT網絡監聽端口, 默認:6881-6999
#dht-listen-port=6881-6999
# 本地節點查找, PT需要禁用, 默認:false
#bt-enable-lpd=true
# 種子交換, PT需要禁用, 默認:true
enable-peer-exchange=true
# 每個種子限速, 對少種的PT很有用, 默認:50K
#bt-request-peer-speed-limit=50K
# 客戶端僞裝, PT需要
peer-id-prefix=-TR2770-
user-agent=Transmission/2.77
# 當種子的分享率達到這個數時, 自動停止做種, 0爲一直做種, 默認:1.0
seed-ratio=0.1
# 強制保存會話, 即使任務已經完成, 默認:false
# 較新的版本開啓後會在任務完成後依然保留.aria2文件
force-save=true
# BT校驗相關, 默認:true
#bt-hash-check-seed=true
# 繼續之前的BT任務時, 無需再次校驗, 默認:false
bt-seed-unverified=true
# 保存磁力鏈接元數據爲種子文件(.torrent文件), 默認:false
#bt-save-metadata=true
2. aria2.session 與 aria2.log

爲Aria2添加session會話文件,日誌文件,路徑和配置文件裏一致

touch /root/.aria2/aria2.session /root/.aria2/aria2.log
3. 啓動
aria2c --conf-path=/root/.aria2/aria2.conf -D

aria2c /root/.aria2/aria2.conf -D     # 2.0 版本以後的啓動方式

#後臺運行——注意 前者和這個命令要先後輸入,不可選擇性輸入一個。
nohup aria2c --conf-path=/root/.aria2/aria2.conf > /root/.aria2/aria2.log 2>&1 &

切記需要放行端口!!!

如果前置權限沒有設置在啓動aria2後再行變更umask後需要重啓aria2!!!


(4)安裝AriaNg

  • 在 /www/domain/ 目錄下安裝 AriaNg
cd /www/wwwroot/95.169.4.225/ariaNg
wget http://dxj.im/aria-ng-020 && unzip aria-ng-0.2.0.zip

備用: wget https://www.moerats.com/usr/down/aria-ng-0.2.0.zip && unzip aria-ng-0.2.0.zip
  • 將 index.html 文件中的域名給成自己的域名
<a href="http://domain/down">down<i class="fa fa-caret-right fa-right-bottom fa-rotate-45 fa-half" aria-hidden="true"></i></a>

附一份AriaNg index.html 完整版

<!DOCTYPE html><html ng-app="ariaNg" manifest="index.manifest"><head><meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,minimal-ui" name="viewport"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="AriaNg"><meta name="apple-mobile-web-app-status-bar-style" content="black"><meta name="description" content="Aria2 Ng Frontend"><meta name="theme-color" content="#3c4852"><meta name="format-detection" content="telephone=no"><title>AriaNg</title><link rel="stylesheet" href="css/bootstrap-3.3.7.min.css"><link rel="stylesheet" href="css/plugins-a7090b9582.min.css"><link rel="stylesheet" href="css/aria-ng-089c039102.min.css"></head><body class="hold-transition skin-aria-ng sidebar-mini fixed"><div class="wrapper" ng-controller="MainController" ng-swipe-left="swipeActions.leftSwipe()" ng-swipe-right="swipeActions.rightSwipe()" ng-swipe-disable-mouse><header class="main-header"><div class="logo"><div class="logo-mini">AriaNg</div><div class="logo-lg" title="AriaNg v0.2.0"><div class="dropdown"><span class="dropdown-toggle" data-toggle="dropdown"><span class="logo-lg-title">AriaNg</span><span class="caret"></span></span><ul class="dropdown-menu dropdown-menu-right" role="menu"><li ng-repeat="setting in rpcSettings" ng-class="{'active': setting.isDefault}"><a class="pointer-cursor" ng-click="switchRpcSetting(setting)"><span ng-bind="(setting.rpcAlias ? setting.rpcAlias : setting.rpcHost + ':' + setting.rpcPort)">RPC</span> <i class="fa" ng-class="{'fa-check': setting.isDefault}"></i></a></li></ul></div></div></div><nav class="navbar navbar-static-top" role="navigation"><div class="navbar-toolbar"><ul class="nav navbar-nav"><li><a class="toolbar" title="{{'New' | translate}}" ng-href="#!/new"><i class="fa fa-plus"></i> <span translate>New</span></a></li><li class="divider"></li><li class="disabled" ng-class="{'disabled': !isSpecifiedTaskSelected('paused')}"><a class="toolbar" title="{{'Start' | translate}}" ng-click="changeTasksState('start')"><i class="fa fa-play"></i></a></li><li class="disabled" ng-class="{'disabled': !isSpecifiedTaskSelected('active', 'waiting')}"><a class="toolbar" title="{{'Pause' | translate}}" ng-click="changeTasksState('pause')"><i class="fa fa-pause"></i></a></li><li class="disabled" ng-class="{'disabled': !isTaskSelected() && !isSpecifiedTaskShowing('complete', 'error', 'removed')}"><a class="toolbar dropdown-toggle" data-toggle="dropdown" title="{{'Delete' | translate}}"><i class="fa fa-trash-o"></i> <i class="fa fa-caret-right fa-right-bottom fa-rotate-45 fa-half" aria-hidden="true"></i></a><ul class="dropdown-menu" role="menu"><li ng-if="isTaskSelected()"><a class="pointer-cursor" ng-click="removeTasks()"><span translate>Remove Task</span></a></li><li ng-if="taskContext.enableSelectAll && isSpecifiedTaskShowing('complete', 'error', 'removed')"><a class="pointer-cursor" ng-click="clearStoppedTasks()"><span translate>Clear Stopped Tasks</span></a></li></ul></li><li class="divider"></li><li class="disabled" ng-class="{'disabled': !taskContext.enableSelectAll || !taskContext.list || taskContext.list.length < 1}"><a class="toolbar" title="{{'Select All' | translate}}" ng-click="selectAllTasks()"><i class="fa fa-th-large"></i></a></li><li class="disabled" ng-class="{'disabled': !taskContext.enableSelectAll || !taskContext.list || taskContext.list.length < 1}"><a class="toolbar dropdown-toggle" data-toggle="dropdown" title="{{'Display Order' | translate}}"><i class="fa fa-sort-alpha-asc"></i> <i class="fa fa-caret-right fa-right-bottom fa-rotate-45 fa-half" aria-hidden="true"></i></a><ul class="dropdown-menu" role="menu"><li><a class="pointer-cursor" ng-click="changeDisplayOrder('default:asc')"><span translate>Default</span> <i class="fa" ng-class="{'fa-check': isSetDisplayOrder('default')}"></i></a></li><li><a class="pointer-cursor" ng-click="changeDisplayOrder('name:asc')"><span translate>By File Name</span> <i class="fa" ng-class="{'fa-check': isSetDisplayOrder('name')}"></i></a></li><li><a class="pointer-cursor" ng-click="changeDisplayOrder('size:asc')"><span translate>By File Size</span> <i class="fa" ng-class="{'fa-check': isSetDisplayOrder('size')}"></i></a></li><li><a class="pointer-cursor" ng-click="changeDisplayOrder('percent:desc')"><span translate>By Progress</span> <i class="fa" ng-class="{'fa-check': isSetDisplayOrder('percent')}"></i></a></li><li><a class="pointer-cursor" ng-click="changeDisplayOrder('remain:asc')"><span translate>By Remain Time</span> <i class="fa" ng-class="{'fa-check': isSetDisplayOrder('remain')}"></i></a></li><li><a class="pointer-cursor" ng-click="changeDisplayOrder('dspeed:desc')"><span translate>By Download Speed</span> <i class="fa" ng-class="{'fa-check': isSetDisplayOrder('dspeed')}"></i></a></li><li><a class="pointer-cursor" ng-click="changeDisplayOrder('uspeed:desc')"><span translate>By Upload Speed</span> <i class="fa" ng-class="{'fa-check': isSetDisplayOrder('uspeed')}"></i></a></li></ul></li><li class="divider"></li><li><a class="toolbar" title="{{'Help' | translate}}" href="http://github.com/mayswind/AriaNg" target="_blank"><i class="fa fa-question-circle-o"></i></a></li></ul></div><div class="navbar-searchbar hidden-xs"><ul class="nav navbar-nav"><li><input class="form-control" ng-placeholder="('Search' | translate)" title="{{'Search' | translate}}" ng-model="searchContext.text"><div class="form-control-icon"><span class="fa fa-search form-control-feedback"></span></div></li></ul></div></nav></header><aside class="main-sidebar"><section class="sidebar"><ul id="siderbar-menu" class="sidebar-menu"><li class="header" translate>Download</li><li data-href-match="/downloading"><a href="#!/downloading"><i class="fa fa-arrow-circle-o-down"></i> <span ng-bind="('Downloading' | translate) + (globalStat && globalStat.numActive > 0 ? ' (' + globalStat.numActive + ')' : '')">Downloading</span></a></li><li data-href-match="/waiting"><a href="#!/waiting"><i class="fa fa-clock-o"></i> <span ng-bind="('Waiting' | translate) + (globalStat && globalStat.numWaiting > 0 ? ' (' + globalStat.numWaiting + ')' : '')">Waiting</span></a></li><li data-href-match="/stopped"><a href="#!/stopped"><i class="fa fa-check-circle-o"></i> <span ng-bind="('Finished / Stopped' | translate) + (globalStat && globalStat.numStopped > 0 ? ' (' + globalStat.numStopped + ')' : '')">Finished / Stopped</span></a></li><li class="header" translate>Settings</li><li data-href-match="/settings/ariang"><a href="#!/settings/ariang"><i class="fa fa-cog"></i> <span translate>AriaNg Settings</span></a></li><li class="treeview"><a href="javascript:void(0);"><i class="fa fa-cogs"></i> <span translate>Aria2 Settings</span> <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a><ul class="treeview-menu"><li data-href-match="/settings/aria2/basic"><a href="#!/settings/aria2/basic"><span translate>Basic Settings</span></a></li><li data-href-match="/settings/aria2/http-ftp-sftp"><a href="#!/settings/aria2/http-ftp-sftp"><span translate>HTTP/FTP/SFTP Settings</span></a></li><li data-href-match="/settings/aria2/http"><a href="#!/settings/aria2/http"><span translate>HTTP Settings</span></a></li><li data-href-match="/settings/aria2/ftp-sftp"><a href="#!/settings/aria2/ftp-sftp"><span translate>FTP/SFTP Settings</span></a></li><li data-href-match="/settings/aria2/bt"><a href="#!/settings/aria2/bt"><span translate>BitTorrent Settings</span></a></li><li data-href-match="/settings/aria2/metalink"><a href="#!/settings/aria2/metalink"><span translate>Metalink Settings</span></a></li><li data-href-match="/settings/aria2/rpc"><a href="#!/settings/aria2/rpc"><span translate>RPC Settings</span></a></li><li data-href-match="/settings/aria2/advanced"><a href="#!/settings/aria2/advanced"><span translate>Advanced Settings</span></a></li></ul></li><li data-href-match="/status"><a href="#!/status"><i class="fa fa-server"></i> <span translate>Aria2 Status</span> <span class="label pull-right" ng-if="globalStatusContext.isEnabled" ng-class="{'label-primary': taskContext.rpcStatus === 'Connecting', 'label-success': taskContext.rpcStatus === 'Connected', 'label-danger': taskContext.rpcStatus === 'Not Connected'}" ng-bind="taskContext.rpcStatus | translate"></span></a></li></ul></section></aside><div id="content-wrapper" class="content-wrapper"><div id="content-body" class="content-body"><div ng-view cg-busy="{ promise: loadPromise, message: ('Loading' | translate) }"></div></div></div><footer class="main-footer"><nav class="navbar" role="navigation"><div class="navbar-toolbar"><ul class="nav navbar-nav"><li><a data-toggle="offcanvas" role="button" title="{{'Toggle Navigation' | translate}}"><i class="fa fa-bars"></i></a></li><li class="divider"></li><li class="dropup"><a class="dropdown-toggle" data-toggle="dropdown" role="button" title="{{'Quick Setting' | translate}}"><i class="fa fa-wrench"></i> <span translate>Quick Setting</span> <i class="fa fa-caret-right fa-right-bottom fa-rotate-45 fa-half" aria-hidden="true"></i></a><ul class="dropdown-menu" role="menu"><li><a class="pointer-cursor" ng-click="showQuickSettingDialog('globalSpeedLimit', 'Global Speed Limit')"><span translate>Global Speed Limit</span></a></li></ul></li><li class="divider"></li><li><a role="button" title="down" href="http://your_domain/down" target="_blank"><i class="fa fa-server"></i><span class="ng-scope">&nbsp;down</span>&nbsp;<i class="fa fa-caret-right fa-right-bottom fa-rotate-45 fa-half" aria-hidden="true"></i></a><li class="divider"></li><li class="dropup"><a class="dropdown-toggle" data-toggle="dropdown" role="button" title="站點"><i class="fa fa-link"></i> <span translate="">站點</span> <i class="fa fa-caret-right fa-right-bottom fa-rotate-45 fa-half" aria-hidden="true"></i></a><ul class="dropdown-menu" role="menu"><li><a class="pointer-cursor" href="http://zuidazy.net/" target="_blank" "><span translate="">最大資源站(推薦)</span></a></li><li><a class="pointer-cursor" href="http://music.junyuewl.com/" target="_blank" "><span translate="">音樂下載</span></a></li><li><a class="pointer-cursor" href="http://www.yongjiuzy.cc/" target="_blank" "><span translate="">永久資源站</span></a></li></ul></li></ul></div><div class="pull-right ng-cloak" ng-if="globalStatusContext.isEnabled"><a class="global-status" title="{{('Click to pin' | translate)}}" ng-pop-chart ng-data="globalStatusContext.data" ng-container="body" ng-placement="top" ng-trigger="click hover" ng-popover-class="global-status-chart"><span class="realtime-speed"><i class="icon-download fa fa-arrow-down"></i> <span ng-bind="(globalStat.downloadSpeed | readableVolume) + '/s'"></span> </span><span class="realtime-speed"><i class="icon-upload fa fa-arrow-up"></i> <span ng-bind="(globalStat.uploadSpeed | readableVolume) + '/s'"></span></span></a></div></nav></footer><ng-setting-dialog setting="quickSettingContext"></ng-setting-dialog></div><script src="js/jquery-2.2.4.min.js"></script><script src="js/angular-packages-1.6.4.min.js"></script><script src="js/bootstrap-3.3.7.min.js"></script><script src="js/moment-with-locales-2.18.1.min.js"></script><script src="js/echarts-common-3.6.1.min.js"></script><script src="js/plugins-2cae979f0c.min.js"></script><script src="js/aria-ng-4a60d788ec.min.js"></script></body></html>

使用Aria2下載BT磁力的時候,速度慢或者沒速度的解決方法:添加BT Tracker服務器

修改Aria2配置文件aria2.conf:

bt-tracker=BT服務器(多個服務器之間用,分開)
#例如
bt-tracker=udp://tracker.leechers-paradise.org:6969/announce,udp://tracker.pirateparty.gr:6969/announce,udp://tracker.cuntflaps.me:6969/announce

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章