PDA

View Full Version : سوال: مشکل آپلود عکس در ajax



billgivz
چهارشنبه 11 فروردین 1389, 11:54 صبح
با سلام به همگی .

همانطور میدونید واسه آپلود دو دستور وجود داره یکی copy و دیگری move_uploaded_file
حالا من وقتی از دستور copy برای آپلود عکس استفاده میکنم در محیط localhost بدرستی کار میکنه ولی وقتی روی هاست میریزم عمل آپلود رو انجام نمیده یعنی روی هاست دستور copy کار نمیکنه و دستور move_uploaded_file در محیط local و در host عمل آپلود رو انجام نمیده و هیچ پیغامی هم نشان نمیده .

لازم به ذکر permition های مربوط به فولدر هاست رو در حالت 777 قرار دادم .

لطفا مرا کامل راهنمایی کنید.

exlord
چهارشنبه 11 فروردین 1389, 12:03 عصر
سورس کدتو بزار..........

امیـرحسین
چهارشنبه 11 فروردین 1389, 16:03 عصر
این آژاکسش کجا بود؟ اگر نمی دونید، توسط آژاکس معمولی نمیشه فایل آپلود کرد.
هاستینگها، بعضی توابع مربوط به مدیریت فایلها رو غیرفعال می کنند بخاطر امنیت بیشتر در سرورهای share. کار نکردن copy در سرور به این علت می تونه باشه.
برای پیدا کردن علت کار نکردن move_uploaded_file، نمایش خطا رو فعال کنید. این کد رو در ابتدای اسکریپتتون قرار بدید:
ini_set('display_errors', 1);

billgivz
چهارشنبه 11 فروردین 1389, 17:04 عصر
این آژاکسش کجا بود؟ اگر نمی دونید، توسط آژاکس معمولی نمیشه فایل آپلود کرد.
هاستینگها، بعضی توابع مربوط به مدیریت فایلها رو غیرفعال می کنند بخاطر امنیت بیشتر در سرورهای share. کار نکردن copy در سرور به این علت می تونه باشه.
برای پیدا کردن علت کار نکردن move_uploaded_file، نمایش خطا رو فعال کنید. این کد رو در ابتدای اسکریپتتون قرار بدید:
ini_set('display_errors', 1);


منظورم از ajax همون ajax with php ( رویداد onclick )
فکر کنم دلیل کار نکردن move_uploaded_file این باشه که حتما باید action صورت بگیره یعنی منظورم همان حالت classic web .
در ضمن error فعال هست . چون زمانی که به روش classic web عکس رو آپلود میکنم عکس به درستی آپلود میشه مشکل من در ajax هست که فکر کنم باید از copy استفاده کرد.
حلا مشکل اصلی من اینه که دستور copy در هاست کارنمیکنه .
کسی تا حالا با مشکل من برخورد نکرده ؟
لطفا مرا راهنمایی کنید.:ناراحت:

billgivz
چهارشنبه 11 فروردین 1389, 19:32 عصر
http://www.uploadify.com/

میشه بیشتر توضیح بدین .

چرا move_uploaded_file داخل ajax کار نمیکنه ؟

و استفاده از دستور copy پیغام زیر رو نشون میده با این مسیر آپلود درست هست

Warning: copy(E:\\\pic\\\3.gif) [function_copy]: failed to open stream: No such file or directory in C:\wamp\www\test\portal\install\school\page-school\send_article.php on line 99

امیـرحسین
چهارشنبه 11 فروردین 1389, 20:07 عصر
توسط آژاکس معمولی نمیشه فایل آپلود کرد.
آژاکس درخواست HTTP رو توسط کوئری ارسال می کنه. از باینری خبری نیست. شما اگر چک کنید میبینید که اصلا FILES_$ وجود نداره.
سرچ کنید، درباره روشهای آپلود بصورت آژاکس صحبت شده. یا باید از فلش استفاده کنید یا فریم مخفی.

درباره copy. فکر کنم اگر از copy استفاده بشه، فایل اصلی حذف نشه! یعنی از فایل آپلود شده دو تا روی سرور باقی می مونه. بعد شما مطمئنید که فایل در این آدرس وجود داره؟ E:\\\pic\\\3.gif

hueman
شنبه 14 فروردین 1389, 18:25 عصر
این آژاکسش کجا بود؟ اگر نمی دونید، توسط آژاکس معمولی نمیشه فایل آپلود کرد.

من هم تا چند ماه پیش اینطوری فکر می کردم ولی برای کاری نیاز داشتم گوگل کردم (http://www.google.com/search?client=opera&rls=en&q=php+ajax+image+uploader&sourceid=opera&ie=utf-8&oe=utf-8) اسکریپت های زیادی رو پیدا کردم، البته نمی دونم سطح دانش من از آژاکس معمولی هست یا نه ولی اکثرا قابل فهم و خصوصی ساری بودن

exlord
شنبه 14 فروردین 1389, 18:52 عصر
برای upload فایل فرم حتما باید send بشه.... شما با ajax میتونی فرمتو سند کنی ولی مشکلی که هست اینکه نمیتونی تشخیص بدی که upload عکس تموم شده یا نه ... در ضمن componnet های آماده و open source برای upload هست با ajax میتونی از اونا استفاده کنی....

امیـرحسین
یک شنبه 15 فروردین 1389, 00:17 صبح
ببینید. توسط آژاکس فقط میشه اطلاعات رو بصورت کوئری فرستاد. فایل بصورت باینری باید منتقل بشه.
اسکریپتهایی هستند که آپلود رو به شکل آژاکس انجام میدهند مثل همون لینکی که از گوگل معرفی کردید و اونها هیچکدوم آژاکس نیستند.
برای آپلود عکس به این شکل کلا دو تا راه وجود داره:

استفاده یک فریم مخفی: یک iframe بسازید و توسط CSS مخفی اش کنید. حالا یک فرم آپلود معمولی درست کنید و نام اون فریم رو به target فرم بدید. اینجوری وقتی فرم submit میشه (که قرار فایلی آپلود شه)، توسط اون فریم انجام میشه و صفحه refresh نمیشه. مثل این:
<form target="myFrame" action="upload.php" method="POST" enctype="multipart/form-data" >
<input type="file" name="file" />
<input type="submit" name="submit" value="Upload" />
</form>
<iframe name="myFrame" style="display: none;"></iframe>
استفاده از Flash

اینها شبیه آژاکس هستند ولی آژاکس نیستند. اگر برای اون فریم onload بذارید، می تونید از اتمام آپلود هم باخبر بشید.

hueman
یک شنبه 15 فروردین 1389, 17:14 عصر
ببینید. توسط آژاکس فقط میشه اطلاعات رو بصورت کوئری فرستاد. فایل بصورت باینری باید منتقل بشه.
اسکریپتهایی هستند که آپلود رو به شکل آژاکس انجام میدهند مثل همون لینکی که از گوگل معرفی کردید و اونها هیچکدوم آژاکس نیستند.
برای آپلود عکس به این شکل کلا دو تا راه وجود داره:

استفاده یک فریم مخفی: یک iframe بسازید و توسط CSS مخفی اش کنید. حالا یک فرم آپلود معمولی درست کنید و نام اون فریم رو به target فرم بدید. اینجوری وقتی فرم submit میشه (که قرار فایلی آپلود شه)، توسط اون فریم انجام میشه و صفحه refresh نمیشه. مثل این:
<form target="myFrame" action="upload.php" method="POST" enctype="multipart/form-data" >
<input type="file" name="file" />
<input type="submit" name="submit" value="Upload" />
</form>
<iframe name="myFrame" style="display: none;"></iframe>
استفاده از Flash

اینها شبیه آژاکس هستند ولی آژاکس نیستند. اگر برای اون فریم onload بذارید، می تونید از اتمام آپلود هم باخبر بشید.


حق با شماست
چندتا اسکریپت رو که نگاه کردم همگی از فریم استفاده کرده بودن
من فکر می کنم اینکه از چه تکنیکی برای آپلود عکس به شکل و شمایل آژاکس استفاده بشه مفهوم عام آژاکس بودن اون اسکریپت رو زیر سوال نمیبره، اینطور نیست؟

امیـرحسین
یک شنبه 15 فروردین 1389, 21:31 عصر
ایده آژاکس از فریم و خود همین روش گرفته شده ولی اگر بخوایم دقیق باشیم، AJAX مخفف Asynchronous Javascript And Xml هست یعنی لازمه اش جاوااسکریپت یا XML غیرهمزمانه.
به هرصورت، لغت اسم زیاد مهم نیست. مهم روش و تکنیکه.

ravand
پنج شنبه 15 مهر 1389, 11:03 صبح
چطوري براش رويداد onload رو قرار بديم مي تونيد توضيح بديد چون خيلي برام مهمه :متفکر:

snail22
پنج شنبه 15 مهر 1389, 11:39 صبح
من دقیقا نفهمیدم مشکل شما چیه ولی در مورد پست اول باید بگم که تابع copy نمی‌تونی فایل های temporary رو کپی کنی این به permission فولدر temp بستگی داره نه فولدری که می‌خواد کپی بشه

mohmadd
پنج شنبه 15 مهر 1389, 21:48 عصر
اول تشکر از امیر حسین عزیز :قلب:

چطوري براش رويداد onload رو قرار بديم مي تونيد توضيح بديد چون خيلي برام مهمه :متفکر:
بعد از اتمام اپلود فایل onload رخ میده .

<iframe name="myFrame" style="display: none;" onload="***"></iframe>

funpatogh
جمعه 16 مهر 1389, 19:28 عصر
من از onload استفاده کردم برای اینکه بعد از اتمام کار پیغامی رو نمایش بدهد اما فایل آپلود میشه و فایلی که در onload گزاشتم اجرا نمیشه


<form name="form" action="send.php" enctype="multipart/form-data" target="answer" method="post">
File :<input type="file" name="file"><br>
<input type="submit" name="submit" value="send">
</form><br>
<iframe name="answer" style="display:none;" onload="1.html"></iframe>

sama01
جمعه 16 مهر 1389, 19:56 عصر
شما در onLoad تابع جاوااسکریپتی که بعد از load شدن صفحه باید اجرا شود را باید مشخص کنید.
مشخصه که صفحه وقتی load می‌شه که فایل ارسال شده و پردازش سمت سرور تمام شده و اطلاعات برای client ارسال شده است.

funpatogh
جمعه 16 مهر 1389, 21:39 عصر
باز هم جوابی نگرفتم
وقتی که send.php فایل رو آپلود کرد onload اون تابع رو اجرا میکنه درسته؟
الان تا صفحه باز میشه فانکشن صدا زده میشه


<html>
<head>
<script>
function etmam(){
document.write("ersal tamam shod");
}
</script>
</head>
<body>
<form name="form" action="send.php" enctype="multipart/form-data" target="answer" method="post">
File :<input type="file" name="file"><br>
<input type="submit" name="submit" value="send">
</form><br>
<iframe name="answer" style="display:none;" onload="etmam();"></iframe>
</body>
</html>

امیـرحسین
شنبه 17 مهر 1389, 00:21 صبح
خب وقتی صفحه داره تگ iframe رو پردازش میکنه یکبار onload برای فریم اتفاق می‌افته.
باید فریم رو توسط جاوااسکریپت بسازید. شبیه این:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function upload(form) {
var div = document.createElement('div');
div.innerHTML = '<iframe name="answer" style="display:none;" onload="onFrameLoad(this);"></iframe>';
form.parentNode.insertBefore(div, form);
}
function onFrameLoad(iframe) {
var response = document.createElement('div');
response.innerHTML = "ersal tamam shod";
iframe.parentNode.insertBefore(response, iframe);
iframe.parentNode.removeChild(iframe);
}
</script>
</head>
<body>
<form name="form" enctype="multipart/form-data" target="answer" method="post" onsubmit="upload(this)">
File :<input type="file" name="file"><br>
<input type="submit" name="submit" value="send">
</form>
</body>
</html>

funpatogh
شنبه 17 مهر 1389, 00:56 صبح
امیر حسین جان action رو فراموش کردی بزاری
مرسی

sama01
شنبه 17 مهر 1389, 01:00 صبح
دیگه action نمی‌خواد.
شما با target درخواست رو به iFrame می‌فرستید.

funpatogh
شنبه 17 مهر 1389, 01:05 صبح
اخه اگه action نزاریم پس کی کار انتقال رو انجام میده؟


move_uploaded_file($_FILES['file']['tmp_name'],$des)

sama01
شنبه 17 مهر 1389, 01:46 صبح
همان‌طور که action درخواست رو به صفحه‌ی مورد نظر ارسال می‌کنه، target هم درخواست رو به iFrame ارسال می‌کنه.

funpatogh
شنبه 17 مهر 1389, 20:17 عصر
همان‌طور که action درخواست رو به صفحه‌ی مورد نظر ارسال می‌کنه، target هم درخواست رو به iFrame ارسال می‌کنه.
متوجه نمیشم منظورت رو میشه با مثال بگید
target فقط محل نمایش فایلی که تو action نوشتیم رو مشخص میکنه

sama01
شنبه 17 مهر 1389, 22:20 عصر
متوجه نمیشم منظورت رو میشه با مثال بگید
target فقط محل نمایش فایلی که تو action نوشتیم رو مشخص میکنه
ببخشید.
حق با شماست.
من اشتباه کردم. استناد کردم به حافظه، در مورد کاری که چند ماه پیش انجام داده بودم.
action باید باشه.