1399/1/2، 09:12 عصر
به نام خدا؛
سلام دوستان امیدوارم حالتون خوب باشه و سال نو هم سال خوبی باشه برای همگی...
بسیار پیش اومده که بخواین یک فایل (تصویری، صوتی یا هر فرمتی) رو توی سرور آپلود کنین. امروز قصد داریم این مسئله رو با هم بررسی کنیم. البته قبل از این بگم که چیزی که الان با شما به اشتراک میگذارم قبلاً در قالب یک تاپیک خیلی وقت پیش توسط یکی از دوستان پرسیده شده بود و من برای اینکه این مطلب مسئله کاربردی هست یک تاپیک جدید ایجاد کردم. قبل از اینکه بریم سراغ کد php باید یک پیش نیاز رو نصب کنین. اون پیش نیاز رفتار Blob هست که توسط آقا مجتبی توسعه داده شده. این رفتار کارش اینه که فایل رو به فرمت base64 در بیاره که پروسه آپلود انجام بشه. این رفتار رو باید به شیء فایل چوزر (File Chooser) اضافه کنین. میتونین رفتار رو از اینجا دریافت کنین. بعد از اینکه رفتار رو دریافت کردین و این رفتار رو به شیء فایل چوزر اضافه کردین باید یک ریکوئست به فایل php در سرور ارسال کنین. اما نمیتونین از درخواست عادی ajax استفاده کنین. بلکه باید از طریق همین رفتار blob درخواست ajax خودتون رو ارسال کنین. وقتی قصد دارین درخواست رو به فایل php ارسال کنین در ایونت نویسی تون شیء فایل چوزر رو انتخاب کنین و بعد اکشن Send File To URL رو انتخاب کنین.
همونطور که در تصویر می بینین شباهت زیادی به ajax معمولی داره.
اما آدرس ریکوئست به این شکل هست که باید در فیلد URL طبق تصویر وارد بشه:در واقع پارامتر folder name همون دایرکتوری هست که قصد دارین توی هاستتون فایل آپلود بـشه. پارامتر File name هم نام . و پارامتر file type هم نوع (فرمت) فایل هست که از اکسپرشن tokenat برای استخراج فرمت فایل استفاده کردیم. random_name هم کارش اینه که یک نام تصادفی برای فایلتون ایجاد کنه. اگر دوست دارین نام فایل همون نامی باشه که روی سیستم کاربر هست کافیه این پارامتر رو برابر با 0 قرار بدین. اگر میخواین یک نام تصادفی براش انتخاب بشه کافیه این پارامتر رو برابر 1 قرار بدین. نام تصادفی با الگوریتم SHA-512 ساخته میشه که برای هر فایلی منحصر به فرد هست.
برای اینکه بفهمین ریکوئست ارسال شده یا نه باید از اکشن On Ajax Completed استفاده کنید.
در ضمن دیگه اکسپرشن ajax.lastdata اینجا کارایی نداره و باید از اکسپرشن Filechooser.blob.lastresult استفاده کنین.
اما کد PHP به این شکله:توضیحات راجع به خروجی کد:
اگر فایل انتخابی توسط کاربر از قبل وجود داشته باشد پیغام زیر نمایش داده می شود:در نظر داشته باشین که چه در حالت اینکه نام خود فایل آپلود بشه و چه نام تصادفی ارور وجود فایل مشابه نمایش داده میشه. یعنی اگر فایل موردنظر قبلاً با حالت نام خودش آپلود شده باشه و الان با حالت نام تصادفی آپلود بشه اجازه آپـلود داده نمیشه چون فایل از قبل موجوده!
اگر فایل انتخابی از قبل موجود نباشد پیغام زیر که حاکی از موفق بودن پروسه بوده است نمایش داده می شود:پ.ن: با این کد هر فرمت فایلی قابل آپلود هست با هر حجمی. اگر میخواین روی این دو آیتم (یعنی فرمت فایل و یا حجم فایل) محدودیتی اعمال کنین میتونین هم در سمت کانستراکت این کارو بکنین و هم در سمت php. اگر مایل بودید که کد رو شخصی سازی کنین در سمت php و تسلط لازم بر php برای ادیت کد رو ندارین میتونن توی همین تاپیک اعلام کنین تا کد رو براتون قرار بدم.
همچنین دقت داشته باشین که دایرکتوری که در کد مشخص میکنین که فایلها در اون آپلود بشن رو از قبل ایجاد نکرده باشین چون اگر این کار رو کرده باشین مجدد یک دایرکتوری درون دایرکتوری فعلی ساخته میشه.
در پایان هم خوشحال میشم نظراتتون رو برام بنویسین
با آرزوی بهترین ها و سالی سرشار از برکت...
سلام دوستان امیدوارم حالتون خوب باشه و سال نو هم سال خوبی باشه برای همگی...
بسیار پیش اومده که بخواین یک فایل (تصویری، صوتی یا هر فرمتی) رو توی سرور آپلود کنین. امروز قصد داریم این مسئله رو با هم بررسی کنیم. البته قبل از این بگم که چیزی که الان با شما به اشتراک میگذارم قبلاً در قالب یک تاپیک خیلی وقت پیش توسط یکی از دوستان پرسیده شده بود و من برای اینکه این مطلب مسئله کاربردی هست یک تاپیک جدید ایجاد کردم. قبل از اینکه بریم سراغ کد php باید یک پیش نیاز رو نصب کنین. اون پیش نیاز رفتار Blob هست که توسط آقا مجتبی توسعه داده شده. این رفتار کارش اینه که فایل رو به فرمت base64 در بیاره که پروسه آپلود انجام بشه. این رفتار رو باید به شیء فایل چوزر (File Chooser) اضافه کنین. میتونین رفتار رو از اینجا دریافت کنین. بعد از اینکه رفتار رو دریافت کردین و این رفتار رو به شیء فایل چوزر اضافه کردین باید یک ریکوئست به فایل php در سرور ارسال کنین. اما نمیتونین از درخواست عادی ajax استفاده کنین. بلکه باید از طریق همین رفتار blob درخواست ajax خودتون رو ارسال کنین. وقتی قصد دارین درخواست رو به فایل php ارسال کنین در ایونت نویسی تون شیء فایل چوزر رو انتخاب کنین و بعد اکشن Send File To URL رو انتخاب کنین.
همونطور که در تصویر می بینین شباهت زیادی به 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"
برای اینکه بفهمین ریکوئست ارسال شده یا نه باید از اکشن 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!"
همچنین دقت داشته باشین که دایرکتوری که در کد مشخص میکنین که فایلها در اون آپلود بشن رو از قبل ایجاد نکرده باشین چون اگر این کار رو کرده باشین مجدد یک دایرکتوری درون دایرکتوری فعلی ساخته میشه.
در پایان هم خوشحال میشم نظراتتون رو برام بنویسین
با آرزوی بهترین ها و سالی سرشار از برکت...