آپلود فایل در سرور توسط 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 ، amin hosseini
#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
#4
ببخشید کد php رو باید کجا وارد کنی؟؟؟؟
 
  پاسخ


 سپاس شده توسط:
#5
(1399/3/2، 06:44 عصر)shhashemi1385 نوشته است: ببخشید کد php رو باید کجا وارد کنی؟؟؟؟
 
شما برای استفاده از زبان PHP که یک زبان سمت سروره به یک هاست (سرور) یا لوکال هاست نیاز دارین.
موفق باشین.
غایب
  پاسخ


 سپاس شده توسط:


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 127 76,637 1402/8/24، 09:00 عصر
آخرین ارسال: mehdiosw
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 17,777 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,170 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 7,051 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100
  رفع مشکل خروجی فونگپ (: M.gh 11 7,347 1400/4/10، 02:17 صبح
آخرین ارسال: oak

پرش به انجمن: