PDA

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



hgfhjgjh
جمعه 10 خرداد 1398, 09:26 صبح
سلام خواهش میکنم من رو راهنمایی کنید 10 روزه درگیر این کد هستم هر کاری میکنم درست عمل نمیکنه و نمیشه ازش استفاده کرد

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


این کد فرم؛ فیلدهای فرم را حذف کردم از کد زیر که خلاصه باشه:

<form method="post" enctype="multipart/form-data" action="">
فیلدهای دیگر فرم در این قسمت هستند ...
<input type="file" name="attachment[]" multiple="multiple">
<button type="submit">submit</button>
</form>


این هم کد پردازش سمت سرور: (بخش های اضافه دریافت و بررسی فیلدهای دیگر فرم را حذف کردم که خلاصه باشد)
نکته بسیار مهم؛ فایل ها تکی نیستند و معمولاً بین 3 تا 10 فایل بصورت همزمان در فیلد فایل در فرم انتخاب و ارسال میشوند


$PostItems=['path'=>'testupload'];

// کد اول :
// این کد را پیدا کردم اما مشکل اون این هست که مقادیر بصورت نادرست وارد میشه
// خروجی realpath : ../php43423.tmp در صورتی که باید آدرس واقعی فایل رو بده
for($i=0;$i<count($_FILES['attachment']['tmp_name']);$i++){
$PostItems['attachment['.$i.']']=new CurlFile(realpath($_FILES['attachment']['tmp_name'][$i]),mime_content_type($_FILES['attachment']['tmp_name'][$i]),basename($_FILES['attachment']['tmp_name'][$i]));
}

// کد دوم
// این کد هست اما باز هم مشکل آدرس فایل اشتباه رو میده
// و فرمت فایل رو tmp در نظر میگیره بجای اینکه فرمت عکس یا فایل رو درج کنه
for($i=0;$i<count($_FILES['attachment']['tmp_name']);$i++){
$PostItems['attachment['.$i.']']=curl_file_create(realpath($_FILES['attachment']['tmp_name'][$i]),mime_content_type($_FILES['attachment']['tmp_name'][$i]),basename($_FILES['attachment']['tmp_name'][$i]));
}

// کد سوم
// این کد راه هم پیدا کردم اما چطور آدرس فایل رو وارد کنم؟
// خروجی realpath اشتباه هست و مقدار نادرست ارائه میده
for($i=0;$i<count($_FILES['attachment']['tmp_name']);$i++){
$PostItems['attachment['.$i.']']='@'.realpath($_FILES['attachment']['tmp_name'][$i]);
}

$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$TargetURL);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_VERBOSE,0);
curl_setopt($ch,CURLOPT_POSTFIELDS,$PostItems);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$result=curl_exec($ch);
curl_close($ch);
echo $result;


و در نهایت در صفحه مقصد که در یک هاست دیگر قرار دارد فایل ها رو میگیره و پردازش میکنه و آپلود میکنه؛ اما چون همش با خطا مواجه میشد، کد زیر رو جایگزین کردم که بتونم ببینم اصلاً فایل ها رو به صورت صحیح ارسال میکنه یا نه که متاسفانه بدلیل اشتباه وارد کردن مقدار Realpath در خروجی مقادیر اشتباه نمایش داده میشه و فرمت رو tmp در نظر میگیره و نام فایل هم میشه php344.tmp یا موارد مشابه با این


if(isset($_FILES['attachment']['tmp_name'])){
for($i=0;$i<count($_FILES['attachment']['tmp_name']);$i++){
echo '<br><br> tmp_name: ' . $_FILES['attachment']['tmp_name'][$i];
echo '<br> name: ' . $_FILES['attachment']['name'][$i];
echo '<br> size: ' . $_FILES['attachment']['size'][$i];
echo '<br> EXTENSION: ' . pathinfo($_FILES['attachment']['tmp_name'][$i],PATHINFO_EXTENSION);
}
}else{echo 'خطا';}


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

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



..\php9CF8.tmp

tmpname:



mypicture.jpg
name:



12312321
size:


jpg
extention:





..\php4CF5.tmp

tmpname:



mypicture2.jpg

name:



12654321

size:


jpg
extention:



اما وقتی در هاست دوم و مقصد قرارش میدم خراب میشه و بخش name خطا داره و فرمت هم میشه tmp

ali_sed
جمعه 10 خرداد 1398, 12:36 عصر
سلام

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

کل آپلود و ارسال اطلاعات فرم را مستقیم روی سرور فایل انجام بدید اگر موفق بود نتیجه را برای سرور اصلی ارسال کنید.

hgfhjgjh
جمعه 10 خرداد 1398, 16:37 عصر
سلام ممنونم از پاسخ شما

ببینید حتماً باید فرم به هاست اصلی ارسال بشه و فقط فایل ها به هاست فایل منتقل بشه و موارد زیر باید در این کد رعایت بشه :

- امکان اینکه فرم را مستقیم به سرور فایل وصل کنم وجود ندارد
- فرم حتماً باید برای هاست اصلی ارسال بشه و فقط فیلد فایل اون برای هاست فایل ارسال میشه
- امکان آپلود فایل در هاست اصلی وجود ندارد (اگر وجود داشت راحت میشد فایل رو در هاست اصلی آپلود کرد و در نهایت با ftp به هاست فایل منتقلش کرد اما خب نمیشه)

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

peymang
جمعه 10 خرداد 1398, 22:43 عصر
دقیقا @ali_sed (http://barnamenevis.org/member.php?19568-ali_sed) درست می گن اگه کرل زدی یعنی اینکه فایلها روی سرور رفته و داخل سوال هم اگه دوباره چک کنی نوشتی بعد از اینکه فایل ها روی سرور آپلود شد منتقل بشن (اگه حجمت کمه می تونی بعد از اینکه منتقلشون کردی پاکشون کنی )

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


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

ali_sed
شنبه 11 خرداد 1398, 02:10 صبح
دستورات کرل برای این هست که فیلد فایل (که کاربر فایل ها رو در فرم انتخاب میکنه) را برای هاست فایل ارسال کند که در اونجا پردازش و آپلود بشه

چنین چیزی غیر ممکن است که با ارسال فیلد ها از روی سرور اصلی به سرور فایل بتوانید کاری کنید که فایلها از سیستم کاربر مستقیم آپلود بشه روی سرور فایل. همانطور که @peymang (http://barnamenevis.org/member.php?398634-hgfhjgjh) گفتند از آجاکس استفاده کنید یا اینکه کل پردازش را روی سرور فایل انجام بدید و نتیجه را از سرور فایل به سروی اصلی ارسال کنید. برای شناسایی کاربر روی سرور فایل هم می توانید از JWT استفاده کنید.

فرم کاربر:


<form method="post" enctype="multipart/form-data" action="http://hostfile.local/upload.php">
فیلدهای دیگر فرم در این قسمت هستند ...
<input type="file" name="attachment[]" multiple="multiple">
<input type="hidden" name="token" multiple="<?php echo $token?>">
<button type="submit">submit</button>
</form>


فایل upload.php روی هاست فایل:


//check $_POST['token'] is valid

// مقادیر همه فیلد ها و فایلها را بررسی کن اگر مشکلی نبود ذخیره کن

// مقادیر فرمها و نام فایلها و لینک دانلود آنها را
// برای سرور اصلی ارسال کن و نتیجه آن را دریافت کن
// من از دستورات ساده استفاده می کنم تا مفهوم را انتقال بدم
// شما می توانید جایگزین کنید همچنین دیتا را با متد پست بفرستید
$result = file_get_contents("http://maindomain.com/result.php?token=$token&filename=1.zip&dllink=something");

// اگر با موفقیت اطلاعات در سرور اصلی ذخیره شد پیام مناسبی برای کاربر ارسال کن