PDA

View Full Version : دانلود فیلد دیتابیس



mohsen6500
شنبه 19 مهر 1393, 12:57 عصر
سلام
من میخوام یه فیلد از رکورد مورد نظرم رو به صورت فایل تکست برای کاربر قرار بدم
مثلا یه فیلد دارم به عنوان توضیحات
حال میخوام یه لینک بزارم برای کاربر که با کلیک روی اون بتونه متن داخل این فیلد رو به صورت یه فایل تکست دریافت کنه
به نظرتون چیکار باید یکنم؟

desatir7316
شنبه 19 مهر 1393, 14:17 عصر
ربطي به Yii نداره
فيلدتو بگير مثل اين همه فيل كه ميگيريم، بعد توي يه فايل save كن بعد لينك اون فايل هم براي دانلود تنظيم كن(هرجور مي خواي مانور بده روش)

mohsen6500
شنبه 19 مهر 1393, 16:34 عصر
سلام دوست عزیز
اولا که من میخوام با Yii باشه
ثانیا نمیخوام بریزمش توی فایل آخه تعداد درخواست ها زیاده فکرشو بکن واسه هرکدوم یه فایل بسازم!
میخوام مستقیم دانلودش کنه اما به صورت فایل text

desatir7316
شنبه 19 مهر 1393, 17:06 عصر
در هر صورت بايد يه فايل باشه كه دانلود شه ديگه؟
يه فايل ايجاد كن بعد حذفش كن، شما كه نمي توني بفهمي كاربر دانلودش تو چه وضعيه دقيق، پس يه شرايط زماني رو براي خودت در نظر بگير و حذفش كن
از header هم فك كنم بتوني استفاده كني


header('Content-type: application/pdf');

MMSHFE
شنبه 19 مهر 1393, 18:53 عصر
این کد رو به اسم Tools.php توی پوشه protected/components ذخیره کنید:

class Tools
{
/**
* Sends the data to be downloaded
*/
public function download($data, $filename)
{
header('Pragma: public'); // required
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false); // required for certain browsers
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="' . $filename . '";');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen($data));
ob_clean();
flush();
echo $data;
Yii::app()->end();
}
}
حالا هرجای برنامه که خواستین چیزی رو واسه دانلود بگذارین، شبیه این مثال عمل میکنید:

Tools::download($model->comments, $model->id . '_comments.txt');

mohsen6500
یک شنبه 20 مهر 1393, 14:29 عصر
دستت درد نکنه استاد
فقط یه چیزی من میخوام به صورت ای جکس باشه ، کدش رو هم به صورت پایین نوشتم

<?php echo CHtml::ajaxLink('<span class="fa fa-cloud-download text-primary"></span> ', array("user/".$sms->s_id."/download_comments"), array( 'type'=>'POST', // Data Request Type 'success'=>'function(data){ $("#div1").html(data); }' ), array( 'title'=>'Download' , 'alt'=>'Download', 'style'=>'width:100%', ));?>
منتها متن رو نشون میده و دانلود نمیشه
اگر هم بخوام واسه لینک بذارمش که تتا صفحه لود میشه شروع میکنهبه دانلود کردن و اجازه نمیده اول روش لینک بشه
چطوری باید استفاده بشه!
گیج شدم حسابی!!

MMSHFE
یک شنبه 20 مهر 1393, 14:42 عصر
با AJAX که کسی دانلود نمیکنه چیزی رو. ساده ترین راهی که به ذهنم میرسه اینه که لینک دانلود رو با target هدایت کنید به یک پنجره جدید. مرورگرها بعد از دانلود، صفحه خالی نشون میدن که کاربر به سادگی اون رو میبنده.

MMSHFE
یک شنبه 20 مهر 1393, 15:03 عصر
راستی یک نکته هم یادم رفت بگم اینکه کد رو اصلاح کردم و بجای mb_strlen از strlen باید استفاده کنید تا سایز فایل به درستی برای دانلود اعلام بشه وگرنه اگه فایلتون حاوی حروف فارسی باشه ناقص دانلود میشه. علتش اینه که mb_strlen حجم فایل رو برحسب کارکتر درنظر میگیره ولی کارکترهای فارسی 2 بایتی هستن و موقع دانلود باید همون 2 بایت درنظر گرفته بشه نه 1 بایت.

mohsen6500
شنبه 22 آذر 1393, 16:10 عصر
سلام
دوستی که این کد رو واسش گذاشتم ، اطلاعاتش رو از سرور خارجی به سرور داخلی منتقل کرده.
توی سرور اولی به خوبی کار می کرد اما الان خطای 500 میده و این خطا رو می نویسه

Non-static method Tools::download() should not be called statically, assuming $this from incompatible context
راستش سردر نمیارم مشکلش چیه!

arta.nasiri
شنبه 22 آذر 1393, 16:28 عصر
بجای خط زیر

public function download($data, $filename)
اینو جایگزین کنید ببینید مشکلتون حل میشه یا نه

public static function download($data, $filename)