PDA

View Full Version : ایجاد یک فایل در سرور جهت دان لود



پدرخوانده
یک شنبه 07 خرداد 1385, 09:49 صبح
در نظر بگیرید در یک سایت داینامیک علاوه بر اطلاعات فایلهای ضمیمه را در دیتابیس ذخیره کردیم (در فیلدهای blob,...)
حالا می خواهم آنها توسط کاربر قابل دان لود باشند
چگونه اینکار را بکنم؟
(در مورد اطلاعات (متن صفحات وب) خوب از جدول خوانده داخل متغیر ریخته و سپس آن را echo می کنم)
(ولی در مورد فایلهای اجرایی , فشرده, فیلم و یا.... چطور اینکار را انجام بدهم (می توانم ازفیلد خوانده و به متغیر نسبت داد ولی چگونه این متغیر را اجرا (دان لود) کنم)

(یه راه حل که به ذهن خودم رسید این است که یک فولدر با پرمیشن 777 داشته باشم و در آنجا یک فایل ایجاد و سپس محتوی متغیر را در آن ذخیره کنم وسپس لینک دان لود آن را اجرا کنم) (ولی با توجه به زمانبر بودن اینکار و همچنین نیاز به فضای اضافی و سالم کار کردن این عملیات در تعداد درخواست بالا چطور عمل می کند ؟!!!!)

----
ودیگر اینکه تصور کنید که این فایلها بصورت خارجی (جدای از جدول) در یک فولدر ذخیره و آدرس آنها در دیتابیس ذخیره شده به هنگام دان لود آنها با توجه به پسوند فایل (تصویر, فیلم, صوت, sql و یا....) به هنگام کلیک جهت دان لود , اجرا می شوند (یعنی تصویر نمایش می یابد, صوت پخش می شود و یا ....) حالا آنکه می خواهم آنها را بر روی هارد خود دان لود کرده و سپس از روی هارد آنها را اجرا کند (مثلا یک فایل صوتی 2 مگابایتی))
یک راه حل تغییر پسوند آنها (به zip یا ....) هست (خوب حالا فرض برای انجام این کار چه باید کرد؟
واقعا فشرده بشه ؟ و سپس دان لود ؟ (با چه ابزاری فشرده بشه))
و دیگر اینکه صوری (مجازی) در سرور پسوندش عوض بشه و دان لود بشه و در کلاینت دوباره به پسوند اولیه برگرده؟)

armin390
یک شنبه 07 خرداد 1385, 11:18 صبح
در نظر بگیرید در یک سایت داینامیک علاوه بر اطلاعات فایلهای ضمیمه را در دیتابیس ذخیره کردیم (در فیلدهای blob,...)
حالا می خواهم آنها توسط کاربر قابل دان لود باشند
چگونه اینکار را بکنم؟
شما باید نوع(Mime Type) فایلی که محتویاتش رو ذخیره کردید بدونید
بعد قبل از اینکه محتویات رو به سمت مرورگر بفرستید توسط header نوع فایل رو مشخص کنی مثلاً یه فایل html


Content-Type: text/html;



ودیگر اینکه تصور کنید که این فایلها بصورت خارجی (جدای از جدول) در یک فولدر ذخیره و آدرس آنها در دیتابیس ذخیره شده به هنگام دان لود آنها با توجه به پسوند فایل (تصویر, فیلم, صوت, sql و یا....) به هنگام کلیک جهت دان لود , اجرا می شوند (یعنی تصویر نمایش می یابد, صوت پخش می شود و یا ....) حالا آنکه می خواهم آنها را بر روی هارد خود دان لود کرده و سپس از روی هارد آنها را اجرا کند (مثلا یک فایل صوتی 2 مگابایتی))
یک راه حل تغییر پسوند آنها (به zip یا ....) هست (خوب حالا فرض برای انجام این کار چه باید کرد؟
واقعا فشرده بشه ؟ و سپس دان لود ؟ (با چه ابزاری فشرده بشه))
و دیگر اینکه صوری (مجازی) در سرور پسوندش عوض بشه و دان لود بشه و در کلاینت دوباره به پسوند اولیه برگرده؟)
اگه منظورت اینه که بعد از درخواست urlی (کلیک روی لینکی) فایل هر نوع باشه حتی html اون صفحه دانلود بشه می تونی از header زیر استفاده کنی:

Content-disposition: attachment; filename=file.ext

...

برای پیدا کردن سورس برنامه های فشرده سازی مختلف تو sourceforge.net یا phpclasses.org .. یه جستجویی کن

پدرخوانده
سه شنبه 16 خرداد 1385, 00:37 صبح
با تشکر
من برای دان لود فایلهای wma (فایل صوتی فشرده) از یک فایل php جداگانه ای برای دانلود استفاده کردم بدین صورت که در پس از دریافت نام فایل و قرار دادن مسیر پایه در ابتدای آن کنترل می کردم که فایل وجود دارد یا خیر
و سپس به کمک دو دستور header آن را دانلود کنم

header('Content-type: application/x-msdownload;');
header('Content-disposition: attachment; filename='.$file);
استفاده کردم ولی متاسفانه درست کار نمی کند
(لازم به ذکر است که قبلش خروجی نداشتم و جزء اولین دستورات خروجی دار فایل می باشد)
به عنوان راه حل آن را بدین صورت تغییر دادم

header('Content-disposition: filename='.$file);
و سپس فایل موردنظر را خوانده و محتویاتش را echo کردم مشکل حل شد.


$fl1 = fopen($file,'br');
if ($fl1 > 0) {
while (!feof($fl1)) {
$buffer = fgets($fl1,4096);
echo $buffer;
}
}
fclose($fl1);

ولی می خواهم بدونم چرا خود دستور هدر نمی تونه اینکار رو انجام بده
(البته لازم به ذکر است که با فایلهای متفاوت و تعیین نوع در دستور اولیه هدر نیز موفق به انجام این کار نشدم)

armin390
جمعه 19 خرداد 1385, 10:54 صبح
header('Content-type: application/x-msdownload;');
header('Content-disposition: attachment; filename='.$file);

بعد از ارسال header باید محتویات فایلت رو به مرورگر بفرستی
اگه این کار رو درست انجام دادی و نتیجه نگرفتی کدت رو بذار اینجا..
اون headerی هم که نوشتی درست نیست!

پ.ن: filename می تونه هر اسمی که می خوای باشه

پدرخوانده
جمعه 19 خرداد 1385, 14:55 عصر
با تشکر از شما
تصور بنده بر این بود که خود دستور header (پس از اشاره به نام فایل) فایل موردنظر را دان لود می کند

ولی خوب بله همانطور که در پست قبلی گفتم فایل را خواندم و echo کردم و فایل دان لود شد
در مورد filename نیز همانطور که گفتم با توجه به تصور قبلی ام نام فایل اصلی را از صفحه دان لودها به این صفحه ارسال کرده بودم ولی خوب متوجه شدم که این در حقیقت نام فایل پس از دان لود در دستگاه کلاینت می باشد نه نام فایل اصلی

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

حالا در ادامه می خواستم بدانم آیا می توانم یک فایل را در زمان اجرا بسازم و اجرا کنم
به طول مثال : تعدادی فایل صوتی بر روی سرور دارم (با پسوند wma) جهت پخش فایل به صورت آبشاری (پخش به هنگام دان لود) می خواهم آن را از طریق فایل دوم (asx) پخش کنم
این فایل )asx) در حقیقت یک فایل کوچک چند خطی است که به فایل اصلی (wma) اشاره می کند حال می خواهم در قسمت پخش فایلهای صوتی در سایت این فایل (asx) را بسازم و پخش کنم
یه راه حل که به نظر خودم رسید در یک شاخه با مجوز 777 فایلی به نام رندوم (با استفاده از تاریخ یا ...) ایجاد کنم و کدهای موردنظر را داخل آن قرار دهم و سپس آن را فایل را فراخوانی کنم
ولی خوب در این روش به نظر خودم روش مطلوبی نیست چرا که بعضا در بستن (حذف) این فایل (asx) مشکل دارم (هر چند از طریق تابع فراخوانی شده در پارامتر onunload تگ body فراخوانی می شود) ولی باز بعضا از دست رفته داریم
می خواستم برای این موضوع چه راه حلی پیشنهاد می کنید؟

armin390
جمعه 19 خرداد 1385, 16:17 عصر
حالا در ادامه می خواستم بدانم آیا می توانم یک فایل را در زمان اجرا بسازم و اجرا کنم
به طول مثال : تعدادی فایل صوتی بر روی سرور دارم (با پسوند wma) جهت پخش فایل به صورت آبشاری (پخش به هنگام دان لود) می خواهم آن را از طریق فایل دوم (asx) پخش کنم
این فایل )asx) در حقیقت یک فایل کوچک چند خطی است که به فایل اصلی (wma) اشاره می کند حال می خواهم در قسمت پخش فایلهای صوتی در سایت این فایل (asx) را بسازم و پخش کنم
یه راه حل که به نظر خودم رسید در یک شاخه با مجوز 777 فایلی به نام رندوم (با استفاده از تاریخ یا ...) ایجاد کنم و کدهای موردنظر را داخل آن قرار دهم و سپس آن را فایل را فراخوانی کنم
ولی خوب در این روش به نظر خودم روش مطلوبی نیست چرا که بعضا در بستن (حذف) این فایل (asx) مشکل دارم (هر چند از طریق تابع فراخوانی شده در پارامتر onunload تگ body فراخوانی می شود) ولی باز بعضا از دست رفته داریم
می خواستم برای این موضوع چه راه حلی پیشنهاد می کنید؟
لزومی نداره که واقعاً فایل asx وجود داشته باشه یعنی می تونی از طریق اسکریپت بعد همون header های بالا خروجی(محتویات فایل asx!) رو به مرورگر بفرستی...

پدرخوانده
شنبه 20 خرداد 1385, 01:06 صبح
با تشکر
حال با توجه به اینکه می خواهیم محتویات (کدهای) فایل asx مربوطه را echo کنیم از چه پارامترهایی در تابع header باید استفاده کنیم
آیا معرفی به صورت یک فایل html
Content-Type: text/html;
(با توجه به اینکه فایل موردنظر در حقیقت اشاره به یک نوع فایل صوتی است نه یک فایل html)

armin390
شنبه 20 خرداد 1385, 16:06 عصر
خوب تو هدر mime type این فایل(asx) رو بذار(من نمی دونم چیه)گوگلینگ کن