PDA

View Full Version : سوال: سوال و نیاز به راهنمایی در ارتباط با کد آپلود فایل به شکل زیر در PHP



hgfhjgjh
دوشنبه 06 خرداد 1398, 10:12 صبح
با عرض سلام و خسته نباشید خدمت شما دوستان عزیز ...

من در کدنویسی سایت بدلیل اینکه سرعت سایت بالاتر باشه یک هاست خیلی قدرتمند با سرعت و کیفیت بالا برای خود سایت دارم و یک هاست عادی با فضای زیاد برای ذخیره فایل ها؛ اینجوری هم هزینه کمتر میشه و هم اینکه سرعت سایت بالاتر هست چون هاست کم حجم اما با کیفیت بالا برای خود سایت گرفتم. (اینجا برای اینکه مشخص باشه اون هاست حجم بالا که میخوام فایل ها در اون آپلود بشه را با نام "هاست فایل" نوشتم)

در زمان آپلود در سمت سرور ابتدا فرمت فایل رو با یک لیست فرمت های مجاز چک میکنم، اگر اوکی نبود از آپلود اون فایل صرف‌نظر میشه و بعد از اون حجم فایل رو هم بررسی میکنم که مناسب باشه و کم و زیاد نباشه؛ حالا مشکل من در انتقال فایل‌های آپلود شده به "هاست فایل" این هست که در سایت نمیتونم فقط فایل رو بدون تغییرات به هاست فایل انتقال بدم مثلاً بصورت ftp و ... و پس از آپلود (یک فایل باشد یا بصورت گروهی و چندین فایل باشد فرقی ندارد و هر دو به یک شکل زیپ و ذخیره میشوند) تمام فایل ها رو با کلاس ZipArchive زیپ میکنم و ذخیره میکنم و بعدش اسم و مسیر رو توی یک جدول در دیتابیس ذخیره میکنم و شناسه ردیف رو میگیرم و برمیگردونم؛ اما با استفاده از ftp نمیتونم این زیپ کردن رو انجام بدم و حتماً باید از روش دیگه ای مثل curl یا ... برای این کار استفاده بشه

کد زیر را مشاهده بفرمایید، با استفاده از این کد اگر نیازی به انتقال فایل از یک سرور به یک سرور دیگه نباشد براحتی آپلود و زیپ کردن انجام میشه:


if(isset($_FILES['attachment']['tmp_name'])){
$Zip=new ZipArchive();
if($Zip->open($Path.$ZipName,false?ZIPARCHIVE::OVERWRITE:ZI PARCHIVE::CREATE)===true){
for($i=0;$i<count($_FILES['attachment']['tmp_name']);$i++){
$iName=$_FILES['attachment']['name'][$i];
$iSize=$_FILES['attachment']['size'][$i];
$iType=strtolower(pathinfo($iName,PATHINFO_EXTENSI ON));
// بررسی فرمت فایل اگر اوکی بود ادامه میده
// بررسی حجم فایل اگر اوکی بود ادامه میده
if(move_uploaded_file($_FILES['attachment']['tmp_name'][$i],($Path.$RandomFileName))){
$Zip->addfile($Path.$RandomFileName,basename($h));
// حذف فایل پس از انتقال به فایل زیپ
}
// محدودیت حداکثر ارسال 10 فایل آپلود شده موفق
}
}
$Zip->close();
if($ZipItem===0){$attachment=0;}else{
// ذخیره اطلاعات در دیتایس و دریافت شناسه رکورد
$attachment='شناسه رکورد ذخیره شده';
}
}else{$attachment=0;}

بخش های اضافه در کد بالا رو حذف کردم که مرتب تر باشه و راحت تر بتونید کد را بررسی کنید. حالا وقتی بخوام فایل‌ها رو به یک سرور دیگر انتقال بدم دو راه وجود داره:

1- راه اول انتقال فایل زیپ نهایی به سرور جدید : این کار خوب نیست چون کاربر در زمان آپلود یک مرتبه باید منتظر بمونه تا فایل آپلود بشه و بعد همچنان منتظر بمونه تا فایل به یک سرور دیگر آپلود و منتقل شود و زمان زیادی کاربر معطل خواهد شد (مثلاً با متد ftp انتقال انجام شود و ...)

2- فایل‌ها را بصورت خام بدون اعمال هیچ تغییری (یعنی فایل‌هایی که پست شده) را به یک سرور دیگر انتقال دهم و در آن سرور تغییرات لازم مثل بررسی و تغییر نام و زیپ کردن انجام بشه و مشکل من دقیقاً همینه که چطور میتونم یک فایل PHP در سرور دیگه داشته باشم و این فایلها رو برای اون بفرستم که با استفاده از کد بالا در سرور جدید آپلود و تغییرات و زیپ کردن انجام بشه ؟ متدهای ftp فقط فایل رو منتقل می‌کنند و امکان ارسال اطلاعات به یک فایل php در یک سرور دیگر در ftp وجود ندارد

لازمه این رو هم بگم که چون فرم های مختلفی برای بخش های مختلف وجود دارند، باید این مقادیر را هم برای سرور دیگر ارسال کنم جهت بررسی های لازم
- عدد : ماکسیمم حجم مجاز هر فایل جهت آپلود : جهت بررسی های لازم
- لیست : لیست فرمت های مجاز آپلود فایل : جهت بررسی های لازم
- مسیر : آدرس فولدر مقصد در سرور دیگر

لطفاً من رو راهنمایی بفرمایید که به چه صورت میتونم این اطلاعات و فایل ها رو برای سرور دیگری ارسال کنم که آپلود و زیپ انجام بشه در اون
اگر با متد Curl هست خواهش میکنم روشش را برام بفرستید چون خیلی گشتم اما کدهایی که پیدا کردم عمل نمیکنند و نادرست هستند

اگر با روش دیگه ای انجام میشه و یا اینکه راه های بهتری برای این انتقال وجود دارد من رو راهنمایی کنید لطفاً

ممنونم از شما

plague
دوشنبه 06 خرداد 1398, 12:34 عصر
برای روش 1 - شما میتونی یک کرون جاب بزاری که فایل ها رو انتقال بده رو سرور دوم دیگه اینجوری نیاز نیست کابر منتظر بمونه
برای روش دو - من درست متوجه نشدم چی گفتی ... ولی اگه منظورت اینه که وبسایت مستقیما فایل ها رو بر روی هاست فایل بارگزاری کنه که به نظر من کار درستی نیست ... ولی خب راهش اینه که تو و وبسایتت فرمی که کاربر فایل رو آپلد میکنه به هاست فایل ارسال کنه داده ها رو ... وگرنه تنها راهت اینه که بیاد رو سرور اول و بعد با ftp منتقل بشه به سرور دوم


شما هر فایلی که آپلود میشه تو سایت رو بریز تو دیتبایس
بعدبا کرون جاب یه کد رو فراخانی کن هر 1 دقیقه که فایل ها رو از دیتابیس بخونه و منتقلشون کنه به سرور دوم

ali_sed
دوشنبه 06 خرداد 1398, 13:38 عصر
سلام

چرا کلا بخش آپلود را روی هاست فایل انجام نمیدهید. یعنی کاربر وقتی آپلود می کند فایل به هاست فایل ارسال شود.

hgfhjgjh
دوشنبه 06 خرداد 1398, 14:23 عصر
دلیلش این هست که فقط آپلود نیست و فرمی که ارسال میشه حاوی اطلاعات زیادی هست که یک یا چند فایل هم بصورت پیوست در فرم انتخاب و به همراه فرم ارسال میشه
اطلاعات در خود سایت ذخیره میشه و تنها فایل قرار هست به اون هاست فایل منتقل بشه پس از زیپ شدن و یا اینکه فایل ها ارسال بشه برای یک صفحه در اون هاست فایل و در اونجا زیپ و ذخیره بشه

plague (http://barnamenevis.org/member.php?123420-plague) راهی که فرمودید مناسب نیست چون پس از ثبت فرم و آپلود کاربر به صفحه ای منتقل میشه که اطلاعات ارسالی خودش و فایل پیوست و ... رو میتونه مشاهده کنه؛ حالا اگر فایل در هاست اصلی ذخیره بشه و بعد از یک یا چند دقیقه به هاست فایل منتقل بشه، یا باید از ارائه لینک دریافت فایل به کاربر جلوگیری بشه و پس از منتقل شدن لینک نمایش داده بشه که جالب نیست و کاربر باید منتظر بمونه
اگر لینک هاست اصلی جهت دانلود داده بشه و پس از انتقال لینک دانلود از هاست فایل ارائه بشه؛ اگر کاربر صفحه رو رفرش نکنه پس از انتقال فایل همچنان لینک هاست اصلی رو میبینه و نمیتونه فایل رو دانلود کنه

باید یک راهی باشه که در سمت سرور بجای استفاده از ftp که فایل رو انتقال میده، خود فیلد آپلودی که پست شده رو منتقل کنه به هاست فایل
به غیر از این باشه نامناسب میشه

البته به فکرم رسید که بخش آپلود را آجاکس کنم که در زمان انتخاب فایل در فرم، پس از انتخاب فایل آپلود بشه به هاست فایل ولی اونجوری مشکلات خاص خودش رو داره و نمیخوام به اون شکل باشه

plague
دوشنبه 06 خرداد 1398, 15:59 عصر
چقدره حجم فایل ها ... ارتباط ftp چون سرور به سرور هستش خیلی سریع انجام میشه و مثل آپلود اولیه از کامپیوتر کلاینت به سرور وقت گیر نیست

hgfhjgjh
دوشنبه 06 خرداد 1398, 16:20 عصر
حجم فایل ها متغیر هست از 1 مگابایت آپلود میشه تا 100 مگابایت اما میانگین بخوایم بگیریم حجم متوسط 40 مگابایت هست
حجم 40 مگ خیلی نیست اما تعداد زیاد در روز این آپلود و ارسال انجام میشه به همین دلیل دنبال یک راه مناسب براش هستم

ali_sed
دوشنبه 06 خرداد 1398, 18:58 عصر
دلیلش این هست که فقط آپلود نیست و فرمی که ارسال میشه حاوی اطلاعات زیادی هست که یک یا چند فایل هم بصورت پیوست در فرم انتخاب و به همراه فرم ارسال میشه

خب می تونید فرم اطلاعات را از فرم آپلود فایل جدا کنید. دو تا فرم داشته باشید.

یک کار دیگه میشه کرد شما لینک فایل روی سرور اصلی را به کاربر می دهید. کاربر روی این لینک کلیک می کند اگر فایل روی سرور اصلی بود کاربر را به آن ریدایرکت کنید و اگر انتقال کامل صورت گرفته بود کاربر را به آدرس فایل روی سرور فایل منتقل کنید.

hgfhjgjh
دوشنبه 06 خرداد 1398, 19:48 عصر
این کار مناسب نیست که دو تا فرم بذارم یکی برای آپلود و یکی برای اطلاعات
چون اطلاعات در مورد فایلهای آپلودی هست و به نوعی از زیبایی و مناسب بودن کار هم کم میشه

اگر کاربر در حال دریافت فایل باشد و فایل منتقل بشه اونوقت دانلودش کنسل میشه و هر چقدر هم دکمه ادامه یا شروع مجدد دانلود را بزند با خطا مواجه میشه و باید مجدد وارد شده و بر روی لینک دریافت کلیک کند که لینک جدید هست

یکی از دوستانم گفت با curl میشه دز سمت سرور زمانی که کاربر فرم را ثبت کرد فایل های دریافتی رو فرستاد برای هاست فایل و نیازی به ftp نیست اما کدش رو نداشت و گفت یا از این استفاده کن:


curl_setopt($ch,CURLOPT_INFILESIZE,filesize($files ));
curl_setopt($ch,CURLOPT_INFILE,$fopen);

یا از این روش:


curl_file_create(...);

اما مورد اول چون از fopen استفاده میکنه فکر کنم قابل استفاده نباشه برای کار من و روش دوم را هم اصلاً نمیدونم چطوریه و گفت curl_file_create کن و بصورت array فایل ها رو با متد post با curl باید بفرستی

کسی میتونه به من در این زمینه کمک کنه ؟