درود مهمان گرامی! ورود ثبت نام


آپلود فایل در سرور توسط php
#1
به نام خدا؛ 
سلام دوستان امیدوارم حالتون خوب باشه و سال نو هم سال خوبی باشه برای همگی...
بسیار پیش اومده که بخواین یک فایل (تصویری، صوتی یا هر فرمتی) رو توی سرور آپلود کنین. امروز قصد داریم این مسئله رو با هم بررسی کنیم. البته قبل از این بگم که چیزی که الان با شما به اشتراک میگذارم قبلاً در قالب یک تاپیک خیلی وقت پیش توسط یکی از دوستان  پرسیده شده بود و من برای اینکه این مطلب مسئله کاربردی هست یک تاپیک جدید ایجاد کردم. قبل از اینکه بریم سراغ کد php باید یک پیش نیاز رو نصب کنین. اون پیش نیاز رفتار Blob هست که توسط آقا مجتبی توسعه داده شده. این رفتار کارش اینه که فایل رو به فرمت base64 در بیاره که پروسه آپلود انجام بشه. این رفتار رو باید به شیء فایل چوزر (File Chooser) اضافه کنین. میتونین رفتار رو از اینجا دریافت کنین. بعد از اینکه رفتار رو دریافت کردین و این رفتار رو به شیء فایل چوزر اضافه کردین باید یک ریکوئست به فایل php در سرور ارسال کنین. اما نمیتونین از درخواست عادی ajax استفاده کنین. بلکه باید از طریق همین رفتار blob درخواست ajax خودتون رو ارسال کنین. وقتی قصد دارین درخواست رو به فایل php ارسال کنین در ایونت نویسی تون شیء فایل چوزر رو انتخاب کنین و بعد اکشن Send File To URL رو انتخاب کنین.
[تصویر:  picore.png]
همونطور که در تصویر می بینین شباهت زیادی به ajax معمولی داره.
اما آدرس ریکوئست به این شکل هست که باید در فیلد URL طبق تصویر وارد بشه:
کد:
"http://yourhost.com/file.php?folder_name="&foldername& "&file_name="&FileChooser.FileNameAt(0)&"&file_type="&tokenat(FileChooser.FileTYPEAt(0),1,"/")&"&random_name="&"0/1"
در واقع پارامتر folder name همون دایرکتوری هست که قصد دارین توی هاستتون فایل آپلود بـشه. پارامتر File name هم نام  . و پارامتر file type هم نوع (فرمت) فایل هست که از اکسپرشن tokenat برای استخراج فرمت فایل استفاده کردیم. random_name هم کارش اینه که یک نام تصادفی برای فایلتون ایجاد کنه. اگر دوست دارین نام فایل همون نامی باشه که روی سیستم کاربر هست کافیه این پارامتر رو برابر با 0 قرار بدین. اگر میخواین یک نام تصادفی براش انتخاب بشه کافیه این پارامتر رو برابر 1 قرار بدین. نام تصادفی با الگوریتم SHA-512 ساخته میشه که برای هر فایلی منحصر به فرد هست.
برای اینکه بفهمین ریکوئست ارسال شده یا نه باید از اکشن On Ajax Completed استفاده کنید.
در ضمن دیگه اکسپرشن ajax.lastdata اینجا کارایی نداره و باید از اکسپرشن Filechooser.blob.lastresult استفاده کنین.
اما کد PHP به این شکله:
کد php:
<?php
// صدور مجوزها برای مرورگر جهت سازگاری با درخواست ajax
header('Access-Control-Allow-Origin: *');
// متغیر تکراری بودن فایل
$rep 0;
// ساختن یک شناسه یکتا برای نام فـایل
// ساختن یک شناسه یکتا برای نام فایلی که قرار است آپلود شود در صورتی که پارامتر نام تصادفی برابر با 1 باشد
if ($_GET['random_name'] == 1){
    // فانکشن هش کردن
    function create_salt($binary_length){
$binary_salt=openssl_random_pseudo_bytes($binary_length);
return (
$binary_salt);
}
$salt='hF^xg_0V)Di|q{7q|-%0n)}q}{C~*AQ}BBfmAglz{UOlXh{c4q5AIgil*]H35BvXhz6V+qIn-{';
// ایجاد هش
$fname $_GET['file_name'];
$password=$_GET['file_name'].$salt;
$name hash('sha512',$password);
$filepath $_GET['folder_name'] . '/' $name '.'.$_GET['file_type'];
$filepath2 $_GET['folder_name'] . '/' $fname '.'.$_GET['file_type'];
if (
file_exists($filepath)){
    echo "The file is available!";
    $rep++;
    }elseif(file_exists($filepath2)){
    echo "The file is available!";
    $rep++;
}
// اگر مقدار پارامتر صفر بود نام فایل تغییری نکند
    }elseif($_GET['random_name'] == 0){
        $name $_GET['file_name'];
        $salt='hF^xg_0V)Di|q{7q|-%0n)}q}{C~*AQ}BBfmAglz{UOlXh{c4q5AIgil*]H35BvXhz6V+qIn-{';
        $password=$_GET['file_name'].$salt;
$name_ex hash('sha512',$password);
$filepath $_GET['folder_name'] . '/' $name '.'.$_GET['file_type'];
$filepath2 $_GET['folder_name'] . '/' $name_ex '.'.$_GET['file_type'];
if (
file_exists($filepath)){
    echo "The file is available!";
    $rep++;
    }elseif(file_exists($filepath2)){
    echo "The file is available!";
    $rep++;
}
}
// پروسه آپلود
if ($rep == 0) {
copy('php://input''./'.$_GET['folder_name'].'/'.$name.'.'.$_GET['file_type']);
echo 
'Done!';
}
?>
توضیحات راجع به خروجی کد:
اگر فایل انتخابی توسط کاربر از قبل وجود داشته باشد پیغام زیر نمایش داده می شود:
کد php:
"The file is available!" 
در نظر داشته باشین که چه در حالت اینکه نام خود فایل آپلود بشه و چه نام تصادفی ارور وجود فایل مشابه نمایش داده میشه. یعنی اگر فایل موردنظر قبلاً با حالت نام خودش آپلود شده باشه و الان با حالت نام تصادفی آپلود بشه  اجازه آپـلود داده نمیشه چون فایل از قبل موجوده!
اگر فایل انتخابی از قبل موجود نباشد پیغام زیر که حاکی از موفق بودن پروسه بوده است نمایش داده می شود:
کد:
"Done!"
پ.ن: با این کد هر فرمت فایلی قابل آپلود هست با هر حجمی. اگر میخواین روی این دو آیتم (یعنی فرمت فایل و یا حجم فایل) محدودیتی اعمال کنین میتونین هم در سمت کانستراکت این کارو بکنین و هم در سمت php. اگر مایل بودید که کد رو شخصی سازی کنین در سمت php و تسلط لازم بر php برای ادیت کد رو ندارین میتونن توی همین تاپیک اعلام کنین تا کد رو براتون قرار بدم.
همچنین دقت داشته باشین که دایرکتوری که در کد مشخص میکنین که فایلها در اون آپلود بشن رو از قبل ایجاد نکرده باشین چون اگر این کار رو کرده باشین مجدد یک دایرکتوری درون دایرکتوری فعلی ساخته میشه.
در پایان هم خوشحال میشم نظراتتون رو برام بنویسین 1
با آرزوی بهترین ها و سالی سرشار از برکت...
 
پاسخ دهید
 سپاس شده توسط: ""M.gh""
#2
آقا میشه یه آموزش بسازین یا همینجا بگین چطور در کانستراکت فایلی که با فایل چوزر انتخاب می کنیم ، محدودیت اعمال کنیم که مثلا اگه سایز عکس از ۲۰۰×۲۰۰ بیشتر‌ بودفلان اتفاق بی افتد.
پیام مدیر انجمن ( آقای ثنایی ) :
 
نقل قول:  
دعوا نکنید و هم دیگر رو دوست داشته باشید.
      
 
پاسخ دهید
 سپاس شده توسط:
#3
(1399/1/2، 10:39 عصر)""M.gh نوشته است: آقا میشه یه آموزش بسازین یا همینجا بگین چطور در کانستراکت فایلی که با فایل چوزر انتخاب می کنیم ، محدودیت اعمال کنیم که مثلا اگه سایز عکس از ۲۰۰×۲۰۰ بیشتر‌ بودفلان اتفاق بی افتد.



خیلی ساده است. میتونی یک اسپرایت خارج از لایوت قرار بدی و وقتی فایل تصویری رو انتخاب کردی اسپرایت تغییر کنه به تصویر انتخابی البته پارامتر size رو روی Resize to image size قرار بده. 
میتونی اسپرایت رو هم خارج از لایوت قرار ندی و در داخل لایوت و در دید باشه ولی Invisible باشه.
بعد یک متغیر بساز و مقدارش رو برابر با Sprite.Height * Sprite.Width قرار بده و بگو اگر مقدار متغیر برابر با 40000 نشد ریکوئست به سرور ارسال نشه. البته اینطوری زیاد درست نیست چون تنها 200 ضربدر 200 حاصلش 40000 نمیشه! بهتره یک متغیر یا دو تا متغیر بسازی که طول و عرض تصویر توش ذخیره بشه و بعد بگی اگر مقدار متغیر یا متغیرها برابر با 200 نبود ریکوئست به سرور ارسال نشه.
موفق باشی
 
پاسخ دهید
 سپاس شده توسط: ""M.gh""
  


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Lightbulb رمزنگاری فایل ها در PHP - فاکتور مهم برای افزایش امنیت سمت سرور Master Badfar 13 235 1399/1/13، 07:32 عصر
آخرین ارسال: Master Badfar
Lightbulb ارتباط با دیتابیس به کمک PDO در PHP Master Badfar 1 86 1399/1/11، 09:23 عصر
آخرین ارسال: ""M.gh""
Lightbulb کار با JSON در PHP Master Badfar 1 88 1399/1/11، 02:43 عصر
آخرین ارسال: oak
Lightbulb استعلام whois در کانستراکت به کمک PHP Master Badfar 1 105 1399/1/10، 07:14 عصر
آخرین ارسال: ""M.gh""
  ایجاد فایل فشرده (ZIP) در PHP و کانستراکت Master Badfar 2 125 1399/1/10، 05:41 عصر
آخرین ارسال: ""M.gh""

پرش به انجمن: