i
در حال برنامه نویسی و آماده سازی نسخه جدید «وبگو» هستیم، در این نسخه قابلیت ها و ظاهر سایت به کلی متفاوت و کاملتر خواهد بود، این فرآیند زمانبر و از مدتی پیش شروع شده و همچنان ادامه دارد، روند پیشرفت پروژه در این قسمت به صورت درصدی مشخص است و به تناوب به روزرسانی می شود.
parsgreen.com
article

ایجاد لینک دانلود مدت دار با PHP و MySQL

mysql-php-limit-download

احتمالا تا به حال سایت هایی را دیده اید که لینک دانلود آنها به اصطلاح مدت دار بوده و پس از گذشت چند ساعت یا چند روز دیگر نمی توان با آن لینک، فایل مورد نظر را دانلود کرد، این سیستم به انگیزه های مختلف ممکن است مورد نیاز باشد، از جمله اینکه می توان بین کاربران مختلف با توجه به حالت دانلود (رایگان یا با پرداخت هزینه) تفاوت قائل شد، یا هر زمان که نیاز بود، بدون حذف فیزیکی فایل از سرور، لینک دانلود آن را غیر فعال کرد، همچنین این حالت معمولا باعث جلوگیری از بروز ترافیک سنگین و درخواست های متعدد برای دانلود فایل ها می شود که این خود بر بهبود عملکرد سرویس های دانلود تاثیر مثبت دارد، به هر صورت فارغ از انگیزه شما برای انجام این کار، در ادامه آموزش، خواهیم دید که چگونه می توان با کمک PHP و MySQL، سیستم ایجاد لینک دانلود مدت دار را طراحی نمود.

ایجاد دیتابیس و جداول لازم


طبق معمول برنامه های مبتنی بر دیتابیس MySQL، اولین گام ما ایجاد و تعریف ساختار پایگاه داده است که در اینجا با توجه به نیازمان ابتدا از طریق برنامه phpMyAdmin یا با استفاده از کدهای PHP، دیتابیس download را می سازیم (در این آموزش فرض بر این است که از طریق برنامه phpMyAdmin پایگاه داده را ساخته اید)، سپس کدهای زیر را (در صورت نیاز پس از اعمال تنظیمات اتصال) در دایرکتوری فرضی time-limit-download و با نام table_create.php در ریشه هاست یا در سرور مجازی اجرا می کنیم (باید این دایرکتوری را در فولدر www یا public_html و فایل را داخل آن داشته باشید).
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>وبگو | ساخت جدول دانلود مدت دار فایل</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
.ltr{
    direction:ltr;
}
</style>
</head>
<body>
<?php
@$con = mysqli_connect('localhost', 'root', '', 'download');
//خطای اتصال
if(mysqli_connect_errno()){
    echo 'اتصال با دیتابیس برقرار نشد:
    <br>
    <div class="ltr">
    '.mysqli_connect_errno().' - '.mysqli_connect_error().'
    </div>';
}
//اتصال برقرار است
else{
    $query = mysqli_query($con, "CREATE TABLE file_storage(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    client_ip VARCHAR(255),    
    original_name VARCHAR(255),
    temp_name VARCHAR(255),
    date_time BIGINT(20)) ENGINE=MyISAM");

    if(mysqli_errno($con)){
        echo 'بروز خطا در ایجاد جدول:
        <br>
        <div class="ltr">'.mysqli_errno($con).' - '.mysqli_error($con).'</div>';        
    }
    else{
        $link = 'http://'.$_SERVER["SERVER_NAME"].'/time-limit-download/test.zip';
        echo 'جدول با موفقیت ساخته شد.
        <br>
        <div class="ltr">
        <a href="'.$link.'">'.$link.'</a>
        </div>';
    }
}

$close = mysqli_close($con);
?>
</body>
</html>
لینک اجرای فایل باید مطابق با نمونه زیر باشد.
http://localhost/time-limit-download/table_create.php
نکته: در این آموزش از اکستنشن mysqli استفاده شده که می توانید مطابق سلیقه از PDO یا حتی اکستنش اولیه mysql استفاده کنید (استفاده از این اکستنشن به جزء در موارد آموزشی و پروژه های قدیمی، توصیه نمی شود).
توضیح:
با اجرای فایل بالا جدولی با نام فرضی file_storage در دیتابیس download ایجاد می شود که این جدول دارای ستون هایی است که در قسمت CREATE TABLE پرس و جوی بالا ملاحظه می کنید، در زیر به صورت مختصر و جهت آشنایی نقش ستون ها را بررسی می کنیم.
ستون id: این ستون به عنوان یک شماره یکتا معمولا در اکثر برنامه های مبتنی بر دیتابیس استفاده می شود (جهت تمایز و مدیریت بهتر داده های مختلف)، نوع این ستون INT است که در این حالت تا مرز 2147483647 ردیف قابل ایجاد است.
ستون client_ip: این ستون برای نگهداری IP کاربر است که در هنگام تطبیق اطلاعات لینک می تواند مورد استفاده قرار گیرد (استفاده از IP صرفا جهت نمونه است و در صورت نیاز می تواند استفاده نشود).
ستون original_name: این ستون نام اصلی فایل را به همراه پسوند آن نگهداری می کند.
ستون temp_name: این ستون برای نگهداری نام hash شده فایل است (hash به عبارت رمزی شده گفته می شود که در مورد استفاده ما به آن token نیز گفته می شود).
ستون date_time: این ستون جهت نگهداری تاریخ و زمان با نمونه فرمت 20140101121110 (ثانیه دقیقه ساعت روز ماه سال) است، از این عدد برای محاسبه مدت زمان انقضای لینک دانلود استفاده می کنیم.

ایجاد لینک دانلود


پس از ایجاد دیتابیس و جدول، اکنون باید کدی داشته باشیم که آدرس های موقت دانلود مدت دار فایل را برایمان ایجاد کند، در واقع در این مرحله به طور مثال کاربر لینک فرضی زیر را از سرور درخواست می کند و در پاسخ، لینک مدت دار به او نشان داده می شود.
نمونه لینک درخواستی کاربر:
http://localhost/time-limit-download/test.zip
نمونه آدرس ایجاد شده برای دانلود مدت دار:
http://localhost/time-limit-download/gCvHGkaDADuTbmq3dQsdSXyZ/test.zip
لذا کدهای زیر را در فایلی با نام download_link.php در دایرکتوری time-limit-download درج کنید.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>وبگو | ایجاد لینک دانلود مدت دار</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
.ltr{
    direction:ltr;
}
</style>
</head>
<body>
<?php
//تابعی برای ایجاد عبارت رندوم
function randomStr($length){
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $random_string = '';
    for($i = 0; $i < $length; $i++){
        $random_string .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $random_string;
}

@$file = $_GET['file'];
if(!isset($file)){
    echo 'مشکلی در دریافت اطلاعات فایل وجود دارد!';
}
else{
    @$con = mysqli_connect('localhost', 'root', '', 'download');
    //خطای اتصال
    if(mysqli_connect_errno()){
        echo 'اتصال با دیتابیس برقرار نشد:
        <br>
        <div class="ltr">
        '.mysqli_connect_errno().' - '.mysqli_connect_error().'
        </div>';
    }
    //اتصال برقرار است
    else{
        $temp = randomStr(24);
        $date = date('YmdHis');
        //مدت زمان اعتبار لینک به ثانیه
        $time = date('YmdHis', time() - 60);
        //ایمن سازی
        $file = mysqli_real_escape_string($con, $file);
        $ip = mysqli_real_escape_string($con, $_SERVER["SERVER_ADDR"]);
        
        //حذف ردیف هایی که تاریخ اعتبار آنها گذشته است
        $query = mysqli_query($con, "DELETE FROM file_storage WHERE date_time < '$time'");
                
        //بررسی ip
        $query = mysqli_query($con, "SELECT temp_name FROM file_storage WHERE client_ip = '$ip' AND original_name = '$file' LIMIT 1");
        $count = mysqli_num_rows($query);
        //استفاده از لینک موجود
        if($count > 0){
            while($row = mysqli_fetch_array($query)){
                $temp = $row['temp_name'];
                //آپدیت زمان
                $update = mysqli_query($con, "UPDATE file_storage SET date_time = '$date' WHERE client_ip = '$ip' AND original_name = '$file' LIMIT 1");
            }
        }
        //ایجاد لینک جدید
        else{
            $query = mysqli_query($con, "INSERT INTO file_storage(
            client_ip, original_name, temp_name, date_time)
            VALUES('".$ip."', '".$file."', '".$temp."', '".$date."')");
        }
        
        if(mysqli_errno($con)){
            echo 'بروز خطا در ذخیره و ایجاد لینک دانلود:
            <br><div class="ltr">'.mysqli_errno($con).' - '.mysqli_error($con).'</div>';
        }
        else{
            $link = 'http://'.$_SERVER["SERVER_NAME"].'/time-limit-download/'.$temp.'/'.$file.'';
            echo 'لینک دانلود با موفقیت ساخته شد:
            <br>
            <div class="ltr">
            <a href="'.$link.'">'.$link.'</a>
            </div>';
        }
    }
    
    $close = mysqli_close($con);    
}
?>
</body>
</html>
توضیح:
منطق به کار رفته در این قسمت خیلی پیچیده نیست، ابتدا فایل درخواستی کاربر از سرور از طریق متد GET دریافت شده و پیش از ایجاد لینک جدید، وجود IP کاربر و نام فایل مشابه در دیتابیس بررسی می شود، اگر فایل مشابهی با این IP در دیتابیس باشد، ضمن به روز رسانی مدت زمان اعتبار لینک، از اطلاعات موجود برای نمایش لینک دانلود مدت دار استفاده می شود، در غیر این صورت (یعنی اگر اطلاعاتی مطابق با IP و نام اصلی فایل در دیتابیس موجود نباشد)، لینکی با اطلاعات جدید ساخته و در دیتابیس نیز INSERT می شود.
نکته 1: ملاحظه می کنید که پیش از هر گونه اقدامی، ابتدا دستور حذف ردیف های تاریخ گذشته را اجرا کرده ایم.
نکته 2: مدت اعتبار لینک با تغییر مقادیر عددی در متغیر time قابل تغییر است، در این مثال ما از عدد 60 ثانیه استفاده کرده ایم که می توان مطابق نیاز آن را افزایش یا احیانا کاهش داد.
نکته 3: بررسی وجود IP و لینک موجود به این دلیل ممکن است ضروری باشد که معمولا علاوه بر مرورگر، برنامه های مدیریت دانلود مانند IDM نیز (هم زمان با مرورگر و به صورت مخفیانه) درخواستی به سرور ارسال می کنند که در این صورت برای یک فایل، دو ردیف و دو لینک دانلود مجزا در دیتابیس خواهیم داشت که قاعدتا یک مورد آن زائد است.
نکته 4: همان طور که پیش تر گفته شد، این برنامه صرفا یک الگو است و می توان بر اساس نیاز خود بخش هایی از آن را حذف یا مواردی اضافه نمود (منتها باید نسبت به انجام این مورد مسلط باشید!).

ایجاد فولدر file و کد اجرای دانلود


پس از ایجاد و ذخیره لینک دانلود مدت دار، قاعدتا این لینک باید توسط کاربر نهایی جهت دانلود فایل استفاده شود، لذا بدین منظور در دایرکتوری time-limit-download فولدر دیگری با نام file ساخته و درون آن فایلی با نام download_file.php می سازیم، کدهای این فایل وظیفه بررسی لینک درخواستی و در صورت تائید، ارسال فایل به مرورگر را به عهده خواهند داشت.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>وبگو | دانلود فایل مدت دار</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
.ltr{
    direction:ltr;
}
</style>
</head>
<body>
<?php
@$token = $_GET['token'];
@$file = $_GET['file'];
if(!isset($file) || !isset($token)){
    echo 'مشکلی در دریافت اطلاعات فایل وجود دارد!';
}
else{
    @$con = mysqli_connect('localhost', 'root', '', 'download');
    //خطای اتصال
    if(mysqli_connect_errno()){
        echo 'اتصال با دیتابیس برقرار نشد:
        <br>
        <div class="ltr">
        '.mysqli_connect_errno().' - '.mysqli_connect_error().'
        </div>';
    }
    //اتصال برقرار است
    else{
        $date = date('YmdHis');
        //مدت زمان اعتبار لینک به ثانیه
        $time = date('YmdHis', time() - 60);
        //ایمن سازی
        $token = mysqli_real_escape_string($con, $token);        
        $file = mysqli_real_escape_string($con, $file);
        
        //حذف ردیف هایی که تاریخ اعتبار آنها گذشته است
        $query = mysqli_query($con, "DELETE FROM file_storage WHERE date_time < '$time'");
        
        //بررسی اطلاعات فایل درخواستی کاربر با سرور
        $query = mysqli_query($con, "SELECT temp_name FROM file_storage WHERE original_name = '$file' AND temp_name = '$token' LIMIT 1");
        $count = mysqli_num_rows($query);
        //اطلاعات فایل معتبر است
        if($count > 0){
            //تابع برای بدست آوردن پسوند فایل
            function getExtension($file){
                preg_match('/\.[^\.]+$/i', $file, $ext);
                return $ext[0];
            }
            
            //نوع فایل
            $file_type = NULL;
            switch(getExtension($file_name)){
                case 'zip':
                $file_type = 'application/zip';
                break;
                case 'pdf':
                $file_type = 'application/pdf';
                break;
                case 'jpg':
                $file_type = 'image/jpeg';
                break;
            }
            
            //ارسال فایل به مرورگر برای دانلود
            $file_name = $file;
            header('Content-Description: File Transfer');
            //header('Content-Type: application/octet-stream');
            header('Content-Type: '.$file_type);
            header('Content-Disposition: attachment; filename='.$file_name);
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            header('Content-Length: '.filesize("$file_name"));
            ob_clean();
            flush();
            readfile("$file_name");
        }
        //لینک فایل معتبر نیست یا فایل حذف شده
        else{
            echo 'فایل مورد نظر یافت نشد!';
        }
    }
    
    $close = mysqli_close($con);
}
?>
</body>
</html>
توضیح:
عملکرد این کد به این صورت است که پارامتر hash یا همان token ارسالی از کاربر و همچنین نام حقیقی فایل را که از طریق لینک مدت دار دانلود دریافت شده با دیتابیس تطبیق داده و در صورتی که اطلاعات معتبر باشد، فایل موجود در دایرکتوری file را به مرورگر (یا هر واسط کاربری دیگر مانند برنامه های مدیریت دانلود) ارسال می کند.
نکته: لطفا برای کسب اطلاعات بیشتر در خصوص این قسمت از آموزش، مطلب مشابه ای را که پیش تر در سایت منتشر شده مطالعه کنید:
محدود کردن لینک دانلود مستقیم فایل ها با PHP و htaccess

دستور htaccess برای ایجاد لینک های استاتیک


در آخرین گام از ایجاد لینک دانلود مدت دار نیاز به دستورات htaccess زیر در ریشه سایت است تا بتوانیم آدرس های استاتیک (آدرس هایی که در آنها علامت ? نباشد) را ایجاد و استفاده کنیم، لذا بدین منظور اگر فایل htaccess. در ریشه سایت وجود دارد، کافی است دستورات جدید را در انتها اضافه کنید، اما اگر این فایل وجود ندارد باید آن را بسازید و کدها را در آن درج نمائید.
RewriteEngine on
RewriteRule time-limit-download/([^/]+)/([^/]+)(\.zip|\.pdf|\.jpg)$ /time-limit-download/file/download_file.php?token=$1&file=$2$3 [NC,L]
RewriteRule time-limit-download/([^/]+)(\.zip|\.pdf|\.jpg)$ /time-limit-download/download_link.php?file=$1$2 [NC,L]
دو دستور بالا به ترتیب برای دریافت لینک مدت دار (token و نام اصلی فایل) و لینک عادی فایل (بدون token) کاربرد دارد.
نکته: اگر از فعال بودن Rewrite Engine در سرور مجازی خود مطمئن نیستید، لطفا در این خصوص در وب جستجو کنید.

دانلود نمونه فایل های آموزش


دانلود نمونه فایل های آموزش ایجاد لینک دانلود مدت دار با PHP و MySQL
sectionدسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
» آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
» نحوه رسم چارت و نمودار آماری با php و mysql
» هوشمند سازی پنل ورود و خروج سایت
» جستجو در مطالب سایت با استفاده از MySQL Full-Text و PHP
» آموزش ساخت فرم عضویت در سایت با php و mysql
commentنظرات (۴۱ یادداشت برای این مطلب ارسال شده است)
نویسنده: وحید
زمان: ۰۰:۳۶:۵۴ - تاریخ: ۱۳۹۳/۰۶/۰۴
سلام.
دستتون درد نکنه. مشکل برطرف شد. فکر میکنم به خاطر کدهای html بود.
فقط خواستم بابت سایت خوبتون ازتون تشکر کنم.
بازم ممنون
نویسنده: وحید
زمان: ۰۰:۵۵:۱۵ - تاریخ: ۱۳۹۳/۰۶/۰۴
سلام.
الان اسکریپت برای فایل هایی که وجود ندارند هم لینک تولید میکنه. مثلا اگر site.com/time-limit-download/123.zip رو وارد کنیم ولی در پوشه ای که فایل هامون در اون قرار دارند 123.zip نباشه باز هم لینک تولید میکنه.
برای حلش این راه مؤثر هست:
در فایل download_link.php موجود در time-limit-download در خط 33 یک enter زده و
if(file_exists('file/'.$file))
{
رو اضافه کنیم و در انتهای کد php جایی که ?> قرار داره ، بالاش یک { بزاریم.
با تشکر
پاسخ: 
سلام
سپاس فراوان از توجه شما، البته این آموزش صرفا یک نمونه کد اولیه جهت ارائه اصول کلی است، قاعدتا توسعه آن در حد یک اسکریپت کاربردی به کار بیشتری نیاز دارد.
نویسنده: ali
زمان: ۱۶:۲۷:۱۹ - تاریخ: ۱۳۹۳/۰۶/۲۱
آیا این اسکریپت برای فایل های حجیم هم کاربرد داره ؟ (حدود 500 مگابایت)
و آیا به سرور فشاری وارد نمیکنه ؟
فرضا همزمان ده نفر فایلهای 500 مگابایتی رو درخواست بدن
پاسخ: 
فایل ها در دیتابیس ذخیره نمی شوند، لذا محدودیت خاصی به لحاظ حجم وجود ندارد، میزان استفاده از منابع سرور و به طور خاص دیتابیس خیلی زیاد نیست، البته قاعدتا اگر سرور شما کاربر زیادی داشته باشد، به همان اندازه باید قدرت پردازش درخواست ها را نیز داشته باشد، در غیر این صورت ممکن است در کار با کدها و ابزارهای مختلف دچار مشکل شوید.
نویسنده: mmz
زمان: ۰۲:۲۷:۵۱ - تاریخ: ۱۳۹۳/۰۷/۰۷
با سلام
من نمونه فایل شما رو دانلود کردم و در ریشه لوکال هاست ریختم و جدول رو ساختم ولی فایل download_link.php و download_file ارور "مشکلی در دریافت اطلاعات فایل وجود دارد!" رو میده.
می دونم ایراد از متد GET هست ولی هر چی تو نت گشتم کارکرد این متد رو متوجه نشدم.
پاسخ: 
سلام
به نظر Rewrite Engine در سرور مجازی شما فعال نیست، متد GET به ارسال پارامترها از طریق URL گفته می شود، در حالت عادی پارامترهایی که پس از علامت ? در آدرس URL می آیند و با & از هم جدا می شوند، با استفاده از Rewrite می توان حالت داینامیک را به لینک های استاتیک (بدون علامت ? تبدیل کرد).
نویسنده: AryanPour
زمان: ۰۰:۰۱:۳۸ - تاریخ: ۱۳۹۳/۰۷/۱۰
ممنون از سایت خوبتون : )
نویسنده: هنر
زمان: ۱۴:۳۶:۱۹ - تاریخ: ۱۳۹۳/۰۸/۲۳
سلام
من واسه دانلود کتاب های سایتم میخوام یه همچین مدل لینکی رو دنبال کنم
اکثرا تو سایت های دانلود دیده میشه
مثال :
www.sitename.com/download.php?kmplayer
البته محدودیت سرعت وجود نداره
فقط این مدلی لینک ها رو نشون میدن که باعث میشه کاربر متوجه نشه که این فایل تو چه مسیری آپلود شده
این به چه شکل هست؟
پاسخ: 
سلام
اصول و روش کلی کار مشترک است که در آموزش حاضر گفته شده، در بخش نحوه ایجاد و استفاده از لینک، می توان به سلیقه و البته با تسلط بر PHP و htaccess حالت های متفاوتی را استفاده کرد.
نتیجه اینکه اگر با PHP و نحوه دوباره نویسی یا Rewrite لینک ها در htaccess آشنا باشید، روش های فوق تنها اندکی با هم تفاوت خواهند داشت.
نویسنده: محسن
زمان: ۰۱:۰۳:۴۶ - تاریخ: ۱۳۹۳/۰۸/۲۴
با عرض سلام و خسته نباشید خدمت شما . من اینو تو هاستم تست زدم لینک و جدول ایجاد میشه ولی مشکلی که هست اینه که روی لینک که کلیک می کنیم فایل زیپ رو به صورت زیر فایل های داخلش رو نشون میده . فایل تست شما زد test.html و من فایل log رو فشرده کردم بعد روی لینکش که کلیک کردم این زد :
حذف شد
می بینید که error_log رو توش نوشته و همین فایلی بوده که زیپ کردم و دانلود هم نمیشه با این اوصاف . باید چیکار کنم ؟
پاسخ: 
سلام
این مشکل ناشی از دریافت اشتباه اطلاعات فایل zip به صورت html توسط مرورگر است که به چند دلیل ممکن است رخ دهد:
- نوع سرور یا تنظیمات آن توابع
ob_clean();
flush();
را نادیده می گیرد.
- در فایل های شما کاراکتر نامرئی یا BOM وجود دارد.
هرچند برای رفع مشکل نیاز به تست است، اما خودتان می توانید موارد زیر را امتحان کنید:
- در کنار توابع فوق، تابع زیر را نیز اضافه کنید:
ob_flush();
- فایل download_file.php را با برنامه ++Notepad باز کرده و از سربرگ ها، گزینه Encoding، قسمت Convert to UTF-8 without BOM را کلیک کنید (فایل را مجدد ذخیره کنید).
- در خط 62 از فایل download_file.php به جای application/zip مقدار application/octet-stream را قرار دهید.
- کلیه کدهای HTML و فضای خالی را از ابتدا و انتهای کدهای PHP (تگ php) در فایل download_file.php حذف کنید.
نویسنده: محمدرضا
زمان: ۱۴:۴۲:۳۹ - تاریخ: ۱۳۹۳/۰۹/۳۰
با سلام و عرض تبریک به جهت این سایت پرمحتوا.
اگر بخواهیم اکانت یا محتوایی که توسط کاربر ایجاد میشود مدت دار باشد آیا میتوان از الگوی فوق استفاده کرد؟ توضیح بفرمایید لطفا!
پاسخ: 
سلام
قاعدتا چون هدف در اینجا متفاوت است به صورت صد در صد قابل کپی برداری نیست! اما از قسمت سنجش و مقایسه تاریخ ها می توانید برای سیستم خود الگوبرداری کنید! البته برای نوشتن اینچنین مواردی آشنایی کافی با مبحث تاریخ و زمان و توابع آن در PHP توصیه می شود.
نویسنده: parsa
زمان: ۱۶:۲۴:۲۲ - تاریخ: ۱۳۹۳/۱۰/۰۳
سلام.
ممنون.
نویسنده: amir
زمان: ۱۴:۵۱:۵۹ - تاریخ: ۱۳۹۳/۱۰/۲۸
سلام .
ممنون بابت آموزش . لینک های دانلودی که ایجاد میشه اندازه فایل نامشخص و قابلیت resume ندارن. راهی هستش ؟
پاسخ: 
سلام
در مورد اندازه فایل نباید مشکلی باشد چون سربرگ زیر استفاده شده:
header('Content-Length: '.filesize("$file_name"));
که حجم فایل را به واسط کاربری ارسال می کند، البته این می تواند از تنظیمات سرور نیز باشد، به طور مثال اگر mod_deflate فعال باشد Content-Length مقدار نامشخص خواهد بود، برای رفع آن می توانید mod_deflate را از طریق htaccess برای یک دایرکتوری غیرفعال کنید:
SetEnvIfNoCase Request_URI ^/download_file\.php no-gzip dont-vary
اما در مورد ادامه دانلود لطفا نمونه کدها و توضیحات موجود در لینک زیر را ملاحظه کنید:
http://stackoverflow.com/questions/157318/resumable-downloads-when-using-php-to-send-the-file
نویسنده: راهنما شرکتها
زمان: ۱۱:۰۰:۴۷ - تاریخ: ۱۳۹۳/۱۱/۰۱
آموزش خوبی بود من تو شرکت خدماتی کار میکنم ایا شما دوره آنلاین آموزش هم برگزار میکنید؟
پاسخ: 
در حال حاضر خیر.
نویسنده: بهنام
زمان: ۲۲:۵۸:۱۷ - تاریخ: ۱۳۹۳/۱۱/۲۲
سلام استاد عزیز خسته نباشی واقعا با زحمات خوبت.
استاد واقعا دلم واستون تنگ شده ایشالله پیروز و سربلند باشید
پاسخ: 
سلام
سلامت باشید :-)
نویسنده: علی
زمان: ۱۶:۳۲:۳۵ - تاریخ: ۱۳۹۴/۰۱/۱۴
با سلام
طرز کار سایت زیر چطوریه ؟ با چه توابع php میشه همچنین کاری کرد یعنی کدهای جاوا اسکریپت رو به یه عده رشته عددی تبدیل کرد و با unescape اشون بشه ازشون استفاده کرد ؟
http://jsuglify.ir
من از escape و window.btoa و eval در جاوا اسکریپت استفاده کردم نشد .
لطفا راهنمایی کنید .
با تشکر
پاسخ: 
سلام
عملکرد سایت مذکور خیلی پیچیده نیست، مقادیر دریافتی تبدیل به کاراکترهایی در استاندارد یونیکد می شوند که در این حالت ابتدای هر کاراکتر با علامت % شروع می شود (مشابه آنچه در URL های سایت های فارسی زبان می بینیم)، سپس مقادیر مانند کد معمولی در بین تگ های script چاپ و در مرورگر اجرا می شوند، انجام این کار در صورت آشنایی با توابعی مانند urlencode، str_replace و... در PHP ممکن است، اطلاعات بیشتر:
http://php.net/manual/en/function.urlencode.php
http://php.net/str_replace
نویسنده: مسعود
زمان: ۰۰:۴۶:۰۹ - تاریخ: ۱۳۹۴/۰۲/۲۱
با سلام.
در بعضی از سایت ها که اقدام به فروش مطالب آنلاین خود می کنند با کپی کردن لینک دانلود (حتی بعد از پرداخت وجه و لاگین کردن) و Paste کردن در IDM نمی توان آن را دانلود کرد و حتما باید روی لینک کلیک کرد. طراحی این روش چگونه است؟
با سپاس فراوان.
پاسخ: 
سلام
به روش های مختلف ایجاد این حالت ممکن است که برای ارائه پاسخ دقیق، صفحه مورد نظر باید دقیقا بررسی شود، اما در کل معمولا از جاوا اسکریپت برای تولید لینک به این شیوه استفاده می کنند، یعنی با کلیک بر روی لینک ظاهری، در واقع یک تابع جاوا اسکریپتی اجرا شده و متناسب با آرگومان های دریافتی، کاربر به آدرس اصلی ارجاع داده می شود، ممکن است این روش با Ajax نیز ترکیب شده باشد.
نویسنده: محمد
زمان: ۱۶:۲۲:۴۶ - تاریخ: ۱۳۹۴/۰۴/۱۷
سلام
چطوری میشه فرمت یه فایل رو نمایش داد
مثلا فایلو از این آدرس فراخونی کردم:
file/new/pic.png.img.png
می خوام اون png آخرشو نمایش بدم یعنی فقط فرمتش رو
همونطور که می بینید داخل نام فایل نقطه ام وجود داره و همچین یک نام مشابه با فرمت فایل حالا من می خوام فقط فرمت فایلی که در بالا هست رو نمایش بدم حالا این فرمت png متغیر هست و شاید gif باشه یا شاید هر فرمت دیگه
داخل یکی از برنامه هام نیاز دارم فرمت فایل رو نمایش بدم
نمی خوام نام فایل نمایش داده بشه فقط فرمت
اگه میشه جواب این سوال رو بدید
با تشکر از شما
پاسخ: 
سلام
برای بدست آوردن فرمت فایل در PHP می توانید از نمونه کد زیر استفاده کنید:
<?php
$path = 'file/new/pic.png.img.gif';
$ext = pathinfo($path, PATHINFO_EXTENSION);
echo $ext;
?>
paged صفحه 2 از 3




more لطفا دقت کنید که یادداشت های زیر منتشر نشده و حذف خواهند شد:
- یادداشت های خارج از موضوع این مطلب.
- سوالات کلی، غیر ضروری و مشکلاتی که هیچ تلاشی برای رفع آن نکرده باشید.
- نظرات حاوی کدها و اسکریپت های خیلی طولانی (به طور مثال کد کامل قالب وبلاگ).

7 × 3
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...
پرشین آی تی
Persianit.net

آموزش و دانلود پروژه های برنامه نویسی سی شارپ (#C)