Created
October 21, 2020 15:14
-
-
Save TheCoderRaman/a23536cab27f189fc353b3e6dc968d78 to your computer and use it in GitHub Desktop.
Copy a online file using the php remote script with progressbar
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* Remote File Copy PHP Script 2.0.0 | |
* | |
* Copyright 2012, Sebastian Tschan | |
* https://blueimp.net | |
* | |
* Licensed under the MIT license: | |
* http://www.opensource.org/licenses/MIT | |
*/ | |
$upload_dir = __DIR__."/files"; | |
if (empty($_REQUEST["url"])) { | |
?><!DOCTYPE HTML> | |
<html lang="en"> | |
<head> | |
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--> | |
<meta charset="utf-8"> | |
<title>Remote File Copy</title> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
</head> | |
<body> | |
<form> | |
<input type="url" placeholder="URL" required> | |
<button type="submit">Start</button> | |
</form> | |
<ul></ul> | |
<progress value="0" max="100" style="display:none;"></progress><span id="percentage"></span> | |
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> | |
<script> | |
function callback(message) { | |
if (!message) { | |
console.error('Empty event callback response.'); | |
return; | |
} | |
$.each(message, function (key, value) { | |
switch (key) { | |
case 'send': | |
$('progress').show(); | |
break; | |
case 'progress': | |
if (value && value.total) { | |
$('progress').val(value.loaded / value.total * 100); | |
console.log(value.loaded / value.total * 100); | |
$("#percentage").html(Math.ceil(value.loaded / value.total * 100)+'%'); | |
} | |
break; | |
case 'done': | |
$('<li style="color:green;">').text(value && value.name).appendTo('ul'); | |
$('progress').hide(); | |
$('#percentage').hide(); | |
break; | |
case 'fail': | |
$('<li style="color:red;">').text(value && value.message).appendTo('ul'); | |
$('progress').hide(); | |
$('#percentage').hide(); | |
break; | |
} | |
}); | |
} | |
$('form').on('submit', function (e) { | |
e.preventDefault(); | |
$('<iframe src="javascript:false;" style="display:none;"></iframe>') | |
.prop('src', '?url=' + encodeURIComponent($(this).find('input').val())) | |
.appendTo(document.body); | |
}); | |
</script> | |
</body> | |
</html><?php | |
exit; | |
} | |
$url = !empty($_REQUEST["url"]) && preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["url"])) ? | |
stripslashes($_REQUEST["url"]) : null; | |
$callback = !empty($_REQUEST["callback"]) && preg_match("|^\w+$|", $_REQUEST["callback"]) ? | |
$_REQUEST["callback"] : "callback"; | |
$use_curl = false;defined("CURLOPT_PROGRESSFUNCTION"); | |
$temp_file = tempnam(sys_get_temp_dir(), "upload-"); | |
$fileinfo = new stdClass(); | |
$fileinfo->name = trim(basename($url), ".\x00..\x20"); | |
// 1KB of initial data, required by Webkit browsers: | |
echo "<span>".str_repeat("0", 1000)."</span>"; | |
function event_callback ($message) { | |
global $callback; | |
echo "<script>parent.".$callback."(".json_encode($message).");</script>"; | |
} | |
function get_file_path () { | |
global $upload_dir, $fileinfo, $temp_file; | |
return $upload_dir."/".basename($fileinfo->name); | |
} | |
function stream_notification_callback ($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) { | |
global $fileinfo; | |
switch($notification_code) { | |
case STREAM_NOTIFY_FILE_SIZE_IS: | |
$fileinfo->size = $bytes_max; | |
break; | |
case STREAM_NOTIFY_MIME_TYPE_IS: | |
$fileinfo->type = $message; | |
break; | |
case STREAM_NOTIFY_PROGRESS: | |
if (!$bytes_transferred) { | |
event_callback(array("send" => $fileinfo)); | |
} | |
event_callback(array("progress" => array("loaded" => $bytes_transferred, "total" => $bytes_max))); | |
break; | |
} | |
} | |
function curl_progress_callback ($curl_resource, $total, $loaded) { | |
global $fileinfo; | |
if (!$loaded) { | |
if (!isset($fileinfo->size)) { | |
$fileinfo->size = $total; | |
event_callback(array("send" => $fileinfo)); | |
} | |
} | |
event_callback(array("progress" => array("loaded" => $loaded, "total" => $total))); | |
} | |
if (!$url) { | |
$success = false; | |
} else if ($use_curl) { | |
$fp = fopen($temp_file, "w"); | |
$ch = curl_init($url); | |
curl_setopt($ch, CURLOPT_NOPROGRESS, false ); | |
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, "curl_progress_callback"); | |
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); | |
curl_setopt($ch, CURLOPT_FILE, $fp); | |
$success = curl_exec($ch); | |
$curl_info = curl_getinfo($ch); | |
if (!$success) { | |
$err = array("message" => curl_error($ch)); | |
} | |
curl_close($ch); | |
fclose($fp); | |
$fileinfo->size = $curl_info["size_download"]; | |
$fileinfo->type = $curl_info["content_type"]; | |
} else { | |
$ctx = stream_context_create(); | |
stream_context_set_params($ctx, array("notification" => "stream_notification_callback")); | |
$success = copy($url, $temp_file, $ctx); | |
if (!$success) { | |
$err = error_get_last(); | |
} | |
} | |
if ($success) { | |
$success = rename($temp_file, get_file_path()); | |
} | |
if ($success) { | |
event_callback(array("done" => $fileinfo)); | |
} else { | |
unlink($temp_file); | |
if (!$err) { | |
$err = array("message" => "Invalid url parameter"); | |
} | |
event_callback(array("fail" => $err)); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment