hgfhjgjh
جمعه 10 خرداد 1398, 10: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
این نکته رو هم بگم که با توجه به ساختار سایت نمیتونم مستقیم آدرس صفحه مقصد رو به فرم بدم جهت آپلود و حتماً باید فرم به یک صفحه در هاست اصلی ارسال بشه و فقط فایل ها برای یک صفحه در یک هاست دیگر ارسال بشه و از همه مهمتر اینکه در صفحه مقصد در هاست دوم (هاست فایل)، فایل ها در زمان آپلود زیپ میشه و تغییرات زیادی روی اونها اعمال میشه که الان حذفشون کردم از کد زیر که شلوغ نشه و به دلیل همین تغییرات مورد نیاز، امکان استفاده از متد 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