add download task list and optimize temp file recovery

This commit is contained in:
HFO4 2018-04-17 19:59:13 +08:00
parent 6d9b67ac20
commit 3326c9232e
4 changed files with 147 additions and 33 deletions

View file

@ -96,14 +96,50 @@ class RemoteDownload extends Controller{
->where("owner",$this->userObj->uid)
->where("status","<>","complete")
->where("status","<>","error")
->where("status","<>","canceled")
//取消的
->select();
foreach ($toBeFlushed as $key => $value) {
$aria2->flushStatus($value["id"],$this->userObj->uid,$this->userObj->getPolicy());
}
}
public function ListDownloading(){
return json(["s"=>"s"]);
public function Cancel(){
$aria2Options = Option::getValues(["aria2"]);
$aria2 = new Aria2($aria2Options);
$downloadItem = Db::name("download")->where("owner",$this->userObj->uid)->where("id",input("post.id"))->find();
if(empty($downloadItem)){
return json(['error'=>1,'message'=>"未找到下载记录"]);
}
if($aria2->Remove($downloadItem["pid"],"")){
return json(['error'=>0,'message'=>"下载已取消"]);
}else{
return json(['error'=>1,'message'=>"取消失败"]);
}
}
public function ListDownloading(){
$downloadItems = Db::name("download")->where("owner",$this->userObj->uid)->where("status","in",["active","ready"])->order('id desc')->select();
foreach ($downloadItems as $key => $value) {
$connectInfo = json_decode($value["info"],true);
if(isset($connectInfo["dir"])){
$downloadItems[$key]["fileName"] = basename($connectInfo["dir"]);
$downloadItems[$key]["completedLength"] = $connectInfo["completedLength"];
$downloadItems[$key]["totalLength"] = $connectInfo["totalLength"];
$downloadItems[$key]["downloadSpeed"] = $connectInfo["downloadSpeed"];
}else{
if(floor($value["source"])==$value["source"]){
$downloadItems[$key]["fileName"] = Db::name("files")->where("id",$value["source"])->column("orign_name");
}else{
$downloadItems[$key]["fileName"] = $value["source"];
}
$downloadItems[$key]["completedLength"] = 0;
$downloadItems[$key]["totalLength"] = 0;
$downloadItems[$key]["downloadSpeed"] = 0;
}
}
return json($downloadItems);
}
}

View file

@ -124,7 +124,9 @@ class Aria2 extends Model{
case 'complete':
$this->setComplete($respondData["result"],$downloadInfo);
break;
case 'removed':
$this->setCanceled($respondData["result"],$downloadInfo);
break;
default:
# code...
break;
@ -151,6 +153,31 @@ class Aria2 extends Model{
return true;
}
private function setCanceled($quenInfo,$sqlData){
@self::remove_directory(ROOT_PATH."public".DS."downloads".DS.$sqlData["path_id"]);
if(!is_dir(ROOT_PATH."public".DS."downloads".DS.$sqlData["path_id"])){
Db::name("download")->where("id",$sqlData["id"])->update([
"status" => "canceled",
]);
}
}
static function remove_directory($dir){
if($handle=opendir("$dir")){
while(false!==($item=readdir($handle))){
if($item!="."&&$item!=".."){
if(is_dir("$dir/$item")){
self::remove_directory("$dir/$item");
}else{
unlink("$dir/$item");
}
}
}
closedir($handle);
rmdir($dir);
}
}
private function updateToMuiltpe($quenInfo,$sqlData){
foreach ($quenInfo["files"] as $key => $value) {
Db::name("download")->insert([
@ -174,6 +201,7 @@ class Aria2 extends Model{
$this->setError($quenInfo,$sqlData,"您当前的上传策略无法使用离线下载");
return false;
}
$this->forceRemove($sqlData["pid"]);
$suffixTmp = explode('.', $quenInfo["dir"]);
$fileSuffix = array_pop($suffixTmp);
$uploadHandller = new UploadHandler($this->policy["id"],$this->uid);
@ -220,7 +248,7 @@ class Aria2 extends Model{
if($delete){
if(file_exists($quenInfo["files"][$sqlData["file_index"]]["path"])){
@unlink($quenInfo["files"][$sqlData["file_index"]]["path"]);
@unlink(dirname($quenInfo["files"][$sqlData["file_index"]]["path"]));
@self::remove_directory(dirname($quenInfo["files"][$sqlData["file_index"]]["path"]));
}
}
Db::name("download")->where("id",$sqlData["id"])->update([
@ -259,6 +287,21 @@ class Aria2 extends Model{
return false;
}
public function forceRemove($gid){
$reqFileds = [
"params" => ["token:".$this->authToken,$gid],
"jsonrpc" => "2.0",
"id" => uniqid(),
"method" => "aria2.forceRemove"
];
$reqFileds = json_encode($reqFileds,JSON_OBJECT_AS_ARRAY);
$respondData = $this->sendReq($reqFileds);
if(isset($respondData["result"])){
return true;
}
return false;
}
private function storageCheck($quenInfo,$sqlData){
if(!FileManage::sotrageCheck($this->uid,(int)$quenInfo["totalLength"])){
return false;

View file

@ -34,32 +34,13 @@
<th width="50%" >文件名</th>
<th class="centerTable">大小</th>
<th class="centerTable">储存位置</th>
<th class="centerTable">下载速度</th>
<th class="centerTable">进度</th>
<th class="centerTable">操作</th>
</tr>
</thead>
<tbody>
<tr class="tr-bar">
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td> <td>the Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td> <td>the Bird</td>
<td>@twitter</td>
</tr>
<tr>
<th scope="row">3</th>
<td>Larry</td>
<td>the Bird</td>
<td>@twitter</td> <td>the Bird</td>
<td>@twitter</td>
</tr>
<tbody id="itemContent">
</tbody>
</table>
</div>

View file

@ -1,9 +1,63 @@
$.get("/RemoteDownload/FlushUser", function(){
$("#loadStatus").html("加载下载列表中");
$.get("/RemoteDownload/FlushUser", function() {
$("#loadStatus").html("加载下载列表中...");
loadDownloadingList();
})
function loadDownloadingList(){
$.getJSON("/RemoteDownload/ListDownloading", function(data){
console.log(data);
})
}
function loadDownloadingList() {
$.getJSON("/RemoteDownload/ListDownloading", function(data) {
$("#itemContent").html();
if(data.length == 0){
$("#loadStatus").html("下载列表为空");
}
data.forEach(function(e) {
$("#itemContent").append(function() {
var row = '<tr id="i-' + e["id"] + '"><th scope="row" class="centerTable">' + e["id"] + '</th><td>' + e["fileName"] + '</td>';
row = row + '<td class="centerTable">' + bytesToSize(e["totalLength"]) + '</td>';
row = row + '<td class="centerTable">' + e["save_dir"] + '</td>';
if (e["downloadSpeed"] == "0") {
row = row + '<td class="centerTable">-</td>';
} else {
row = row + '<td class="centerTable">' + bytesToSize(e["downloadSpeed"]) + '/s</td>';
}
row = row + '<td class="centerTable">' + GetPercent(e["completedLength"], e["totalLength"]) + '</td>'
row = row + '<td class="centerTable"><a href="javascript:" onclick="cancel('+e["id"]+')" >取消</a></td>'
return row + "</tr>";
});
$("#i-" + e["id"]).css({
"background-image": "-webkit-gradient(linear, left top, right top, from(#ecefff), to(white), color-stop("+e["completedLength"]/e["totalLength"]+", #ecefff), color-stop("+e["completedLength"]/e["totalLength"]+", white))",
});
$(".table-responsive").slideDown();
$("#loadStatus").slideUp();
});
})
}
function bytesToSize(bytes) {
if (bytes === 0) return '0 B';
var k = 1000, // or 1024
sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
i = Math.floor(Math.log(bytes) / Math.log(k));
return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
}
function GetPercent(num, total) {
num = parseFloat(num);
total = parseFloat(total);
if (isNaN(num) || isNaN(total)) {
return "-";
}
return total <= 0 ? "0%" : (Math.round(num / total * 10000) / 100.00 + "%");
}
function cancel(id){
$.post("/RemoteDownload/Cancel", {id:id}, function(data){
console.log(data);
if(data.error){
toastr["warning"](data.message);
}else{
toastr["success"](data.message);
}
})
}