PDA

View Full Version : به دست آوردن جحم فایل از روی URL



IamOverlord
سه شنبه 06 تیر 1391, 19:40 عصر
سلام.
چه طور می تونم حجم یه فایل رو با داشتن URL اش به دست بیارم بدون این که اون فایل رو دانلود کنم؟

تاپیک مربوطه >> (http://barnamenevis.org/showthread.php?347781-Remote-Uploader)

امید امرایی
سه شنبه 06 تیر 1391, 21:03 عصر
سلام دوست گرامی،

اگه می خوایید با جاوا اسکریپت انجام بشه از تابع زیر استفاده کنید


function filesize (url) {
var req = this.window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
if (!req) {
throw new Error('XMLHttpRequest not supported');
}

req.open('HEAD', url, false);
req.send(null);
if (!req.getResponseHeader) {
try {
throw new Error('No getResponseHeader!');
} catch (e) { return false;
}
} else if (!req.getResponseHeader('Content-Length')) {
try {
throw new Error('No Content-Length!'); } catch (e2) {
return false;
}
} else {
return req.getResponseHeader('Content-Length'); }
}

IamOverlord
سه شنبه 06 تیر 1391, 21:25 عصر
سلام دوست عزیز، فکر می کنم مشکلی این جا باشه:
req.open('HEAD', url, false);
req.send(null);
می شه کد رو تست کنید؟

امید امرایی
چهارشنبه 07 تیر 1391, 09:11 صبح
اشکالی نداشت دوست عزیزم
لطفا بفرمایید چه اشکالی پیش میاد
ضمنا می تونید از jQuery هم برای کنترل بهتر استفاده کنید


var request;
request = $.ajax({
type: "HEAD",
url: 'http://www.site.com/file.zip',
success: function () {
alert("Size is " + request.getResponseHeader("Content-Length"));
}
});});

IamOverlord
دوشنبه 19 تیر 1391, 13:52 عصر
انگار مشکلات دیگه ای در کد جاوااسکریپتم هست، هر چی سعی کردم debug کنمش نشد، می شه کمکم کنید؟

function update_upload_status(){
alert('update_upload_status()');
var source_url = document.getElementById('url').value;
alert(source_url);
var destination_url = source_url.substring(source_url.lastIndexOf('/')+1);
alert(destination_url);
destination_url = 'http://ektoplazm.ir/files/' . destination_url;
alert(destination_url);
var sfilesize;
var dfilesize;
var request;
alert(1);
sfilesize=get_remote_file_size(source_url);
alert(2);
alert(sfilesize);
dfilesize=get_remote_file_size(destination_url);
alert(dfilesize);
var progress = dfilesize / sfilesize * 100;
alert('progress=' + progress);

if (progrss==100){
document.getElementById('progress').innerhtml='don e!';
}else{
document.getElementById('progress').innerhtml=prog ress+'%';
}
}

function get_remote_file_size (url) {
var req = this.window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
if (!req) {
throw new Error('XMLHttpRequest not supported');
}

req.open('HEAD', url, false);
req.send(null);
if (!req.getResponseHeader) {
try {
throw new Error('No getResponseHeader!');
} catch (e) { return false;
}
} else if (!req.getResponseHeader('Content-Length')) {
try {
throw new Error('No Content-Length!'); } catch (e2) {
return false;
}
} else {
return req.getResponseHeader('Content-Length'); }
}

IamOverlord
سه شنبه 27 تیر 1391, 13:39 عصر
ببینید؛ همچنان مشکلی در این خط هست و کد بعد از این خط اجرا نمی شه:
req.open('HEAD', url, false);

eAmin
چهارشنبه 28 تیر 1391, 14:15 عصر
ببینید تا الان تمامی کدهایی که در این تاپیک برای اینکار قرار داده شده بدرستی کار میکنه. منتها شما باید بدونید که چطور از اون استفاده کنید. منظورم اینه که با Ajax و محدودیت های اون کاملا آشنا باشید.
مورد اول اینکه در Ajax شما نمیتونید درخواستهای Cross Domain بفرستید، یعنی شما اگر از این آدرس http://requestAjax.com/index.php به این آدرس http://responseAjax.com/files.zip درخواست بفرستید، خطا یا هیچ جوابی دریافت نمیکنید.

ولی روشهایی برای ارسال درخواست های Cross Domain هست که تو همین انجمن درباره اش بحث شده قبلا.

درضمن من کد شما رو Refactor کردم، اونهمه try catch همگی به معنی بود و بجز بالابردن حجم و کثیف تر کردن کد هیچ خاصیت دیگه ای نداشت!

function get_file_size (url) {
var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

req.open('HEAD', url, false);
req.send(null);

return (req.status === 200) ? req.getResponseHeader('Content-Length') : 'null';
}

console.log(get_remote_file_size('http://localhost/xhr/app.zip'));

IamOverlord
شنبه 31 تیر 1391, 17:05 عصر
ببینید در همون کدی که گذاشتم، این خط رو هر جایی که قرار بدم، کد از اون جا به بعد اجرا نمی شه:
alert(get_remote_file_size('http://muteam.fm/dl/Anomalia%20-%20Pure%20Energy%20(2012)/03-anomalia_-_dialogic_(vs_bond)-mycel.mp3'));

تابع get_remote_file_size هم اینه:
function get_remote_file_size (url) {
var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

req.open('HEAD', url, false);
req.send(null);

return (req.status === 200) ? req.getResponseHeader('Content-Length') : 'null';
}

کل کدم هم اینه:
<html>
<head>
<title>upload.php</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language='javascript' type="text/javascript">

alert('javascript');

function get_remote_file_size (url) {
var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

req.open('HEAD', url, false);
req.send(null);

return (req.status === 200) ? req.getResponseHeader('Content-Length') : 'null';
}

function do_upload()
{

alert('do_upload()');
var source_url = document.getElementById('url').value;
$.ajax({
type: "POST",
url: "http://ektoplazm.ir/files/upload3.php",
data: { url: source_url, submit: "Upload" }
}).done(function( msg ) {
alert( "DONE!" );
});
//continue : update upload status
setInterval('update_upload_status()',512);
}

function update_upload_status(){
alert('update_upload_status()');
var source_url = document.getElementById('url').value;
alert(source_url);
var destination_url = 'http://ektoplazm.ir/files/' + source_url.substring(source_url.lastIndexOf('/')+1);
alert(destination_url);
var sfilesize;
var dfilesize;
var request;
alert(1);
alert(get_remote_file_size(source_url));
sfilesize = get_remote_file_size(source_url);
alert(sfilesize);
alert(2);
dfilesize = get_remote_file_size(destination_url);
alert(dfilesize);
var progress = dfilesize / sfilesize * 100;
alert('progress=' + progress);

if (progrss==100){
document.getElementById('progress').innerhtml='don e!';
}else{
document.getElementById('progress').innerhtml=prog ress+'%';
}
}




</script>
</head>
<body>
<form action='' method="post">
<input name="url" id='url' size="50" />
<input name="upload" type="button" value='upload' onclick="javascript:do_upload();" />
</form>
<p id='progress'>progress</p>
</body>
</html>
<?php

// maximum execution time in seconds
set_time_limit (24 * 60 * 60);

if (!isset($_POST['submit'])) die();

// folder to save downloaded files to. must end with slash
$destination_folder = '';

$url = $_POST['url'];
$newfname = $destination_folder . basename($url);

echo $url;

$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");

if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}

if ($file) {
fclose($file);
}

if ($newf) {
fclose($newf);
}

?>

مرورگرم هم Google Chrome هست...

به نظر شما مشکل چی می تونه باشه؟!

IamOverlord
شنبه 31 تیر 1391, 17:13 عصر
ببینید اون function رو به این صورت تغییر دادم:
function get_remote_file_size (url) {
alert('hey!');
var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
alert('wow!');
req.open('HEAD', url, false);
alert('nop!');
req.send(null);
alert('yup!');

return (req.status === 200) ? req.getResponseHeader('Content-Length') : 'null';
}

مشکل این جاست که همه ی alert ها کار می کنن، ولی yup! نه...

eAmin
شنبه 31 تیر 1391, 18:15 عصر
ببینید در همون کدی که گذاشتم، این خط رو هر جایی که قرار بدم، کد از اون جا به بعد اجرا نمی شه:شما به عرایض بنده توجه کردید؟


مورد اول اینکه در Ajax شما نمیتونید درخواستهای Cross Domain بفرستید، یعنی شما اگر از این آدرس http://requestAjax.com/index.php به این آدرس http://responseAjax.com/files.zip درخواست بفرستید، خطا یا هیچ جوابی دریافت نمیکنید.
مثلا شما در این کد یک آدرس خارجی دادید، http://muteam.fm:

alert(get_remote_file_size('http://muteam.fm/dl/Anomalia%20-%20Pure%20Energy%20(2012)/03-anomalia_-_dialogic_(vs_bond)-mycel.mp3'));

وقتی این درخواست جواب دریافت میکنه که درخواست از همون دامین ارسال شده باشه. مثلا اگر کدهای شما رو در فایل request.php ذخیره کنیم و در این آدرس قرار بدیم، مثل http://muteam.fm/request.php کدها بدرستی اجرا میشه، ولی اگر همین فایل request.php در دامنه ی دیگری مثل http://ektoplazm.ir/request.php قرار داشته باشه و به آدرس http://muteam.fm/aa.mp3 درخواست بفرسته، هیچ جوابی دریافت نمیکنه.

برای حل این مشکل یک راه مناسب هست، اونم اینه که شما با php از طریق curl کدهایی بنویسید که حجم فایلها خارجی رو دریافت کنه، و این کدهای php رو در هاست و دامین خودتون قرار بدید مثلا CURL_GET_Remote_File_Size.php، بعد هر وقت نیاز داشتید آدرس فایل خارجی که در دامین شما نیست در این فایل قرار بدید و با کدهای بالا حجم فایلها رو بصورت لحظه به لحظه دریافت کنید.

بهتر از این نمیتونم توضیح بدم!

IamOverlord
سه شنبه 03 مرداد 1391, 18:23 عصر
درست شد...

upload3.php:
<html>
<head>
<title>Remote Uploader</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language='javascript' type="text/javascript">
var intervalHandle = null;
var sfilesize=0;
var dfilesize=0;
var progress=0;

function do_upload()

{
var source_url = document.getElementById('url').value;
$.ajax({
type: "POST",
url: "http://ektoplazm.ir/apps/upload3.php",
data: { url: source_url, submit: "Upload" }
}).done(function( msg ) {
});
var request = $.ajax({
type: "POST",
url: "http://ektoplazm.ir/apps/upload3_getfilesize.php",
data: { url: source_url}
}).done(function( msg ) {
sfilesize = msg;
intervalHandle = setInterval('update_upload_status()',100);
});
}
function update_upload_status(){
var source_url = document.getElementById('url').value;
var request = $.ajax({
type: "POST",
url: "http://ektoplazm.ir/apps/upload3_getfilesize.php",
data: { url: source_url.substring(source_url.lastIndexOf('/')+1)}
}).done(function( msg ) {
dfilesize = msg;
progress = dfilesize / sfilesize * 100;
if (progress==100){
$('#progress').text('Done. ('+Math.floor(progress)+'%)');
clearInterval(intervalHandle);
}else{
$('#progress').text('Wait... ('+Math.floor(progress)+'%)');
}
});
}
</script>
</head>
<body>
<form action='' method="post">
<input name="url" id='url' size="50" value='http://muteam.fm/dl/Aeon Pulse - Inner Melody (2011)/05. Touch The Sky.mp3' />
<input name="upload" type="button" value='upload' onclick="javascript:do_upload();" />
</form>
<p id='progress'>progress</p>
</body>
</html>
<?php
// maximum execution time in seconds
set_time_limit (24 * 60 * 60);
if (!isset($_POST['submit'])) die();
// folder to save downloaded files to. must end with slash
$destination_folder = '';
$url = $_POST['url'];
$newfname = $destination_folder . basename($url);
echo $url;
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
?>

upload3_getfilesize.php:

<?php
$remoteFile = $_REQUEST['url'];
if (substr($remoteFile,0,4)=='http'){
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
echo 'cURL failed';
exit;
}
$contentLength = 'unknown';
$status = 'unknown';
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
$status = (int)$matches[1];
}
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
$contentLength = (int)$matches[1];
}
echo $contentLength;
}else{
echo filesize($remoteFile);
}
?>

IamOverlord
سه شنبه 03 مرداد 1391, 18:54 عصر
این هم کد در یک فایل upload3.php، چون دوست دارم کار ها رو تو یه فایل انجام بدم:

<?php
if(isset($_REQUEST['function'])){

switch ($_REQUEST['function']) {
case 'upload':
// maximum execution time in seconds
set_time_limit (24 * 60 * 60);
if (!isset($_POST['submit'])) die();
// folder to save downloaded files to. must end with slash
$destination_folder = '';
$url = $_POST['url'];
$newfname = $destination_folder . basename($url);
echo $url;
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
break;
case 'getfilesize':
$remoteFile = $_REQUEST['url'];
if (substr($remoteFile,0,4)=='http'){
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
echo 'cURL failed';
exit;
}
$contentLength = 'unknown';
$status = 'unknown';
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
$status = (int)$matches[1];
}
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
$contentLength = (int)$matches[1];
}
echo $contentLength;
}else{
echo filesize($remoteFile);
}
break;
}

}else{


echo <<< EOT


<html>
<head>
<title>Remote Uploader</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language='javascript' type="text/javascript">
var intervalHandle = null;
var sfilesize=0;
var dfilesize=0;
var progress=0;

function do_upload()

{
var source_url = document.getElementById('url').value;
$.ajax({
type: "POST",
url: "http://ektoplazm.ir/apps/upload3.php",
data: { function : 'upload' , url: source_url, submit: "Upload" }
}).done(function( msg ) {
});
var request = $.ajax({
type: "POST",
url: "http://ektoplazm.ir/apps/upload3.php",
data: { function: 'getfilesize' , url: source_url}
}).done(function( msg ) {
sfilesize = msg;
intervalHandle = setInterval('update_upload_status()',100);
});
}
function update_upload_status(){
var source_url = document.getElementById('url').value;
var request = $.ajax({
type: "POST",
url: "http://ektoplazm.ir/apps/upload3.php",
data: { function: 'getfilesize' , url: source_url.substring(source_url.lastIndexOf('/')+1)}
}).done(function( msg ) {
dfilesize = msg;
progress = dfilesize / sfilesize * 100;
if (progress==100){
$('#progress').text('Done. ('+Math.floor(progress)+'%)');
clearInterval(intervalHandle);
}else{
$('#progress').text('Wait... ('+Math.floor(progress)+'%)');
}
});
}
</script>
</head>
<body>
<form action='' method="post">
<input name="url" id='url' size="50" value='http://muteam.fm/dl/Aeon Pulse - Inner Melody (2011)/05. Touch The Sky.mp3' />
<input name="upload" type="button" value='upload' onclick="javascript:do_upload();" />
</form>
<p id='progress'>progress</p>
</body>
</html>


EOT;

}

?>