إعادة تسمية ملف PDF المراد تحميلها عند الطيران
سؤال
معطى: جميع ملفات PDF التي تم تحميلها على الخادم مسبوسين مع الطابع الزمني. في وقت لاحق يمكن للمستخدم تنزيل هذه الملفات مرة أخرى. هذه أسماء الملفات (القبيحة) لن تتغير مرة أخرى على الخادم.
سؤال: عندما أعطي الخيار لتنزيل ملف PDF، يبدو اسم الملف قبيح وطويل. كيف يمكنني تغيير هذا الاسم إلى شيء معقول، بحيث عند تنزيل المستخدم هذا الملف، لا يبدو الاسم غريبا؟
هل أحتاج إلى إنشاء نسخة، لأن إعادة تسمية الملف الأصلي ليس خيارا؟ لن يكون الأمر أكثر من ذلك لكل ملف قابل للتنزيل؟ من الواضح حذف الملف المنسوخة سيكون خطوة إضافية أخرى؟
هل من الممكن إعادة تسمية الملف بمجرد تنزيل الملف بالكامل على جانب العميل؟
ماذا تقترح يا رفاق؟
المحلول
شيء من هذا القبيل:
<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('original.pdf');
?>
نصائح أخرى
كنت بحاجة للقيام بذلك للحصول على مشروع حديث وكان مرتبكا بعض الشيء حول كيفية التنفيذ، لكنه أحسب ذلك قريبا بعد رؤية إجابة كلاوس. لمزيد من التوضيح في استجابة كلاوس:
1) إنشاء ملف يسمى، قل، "process.php". تعديل رمز KLAUS بحيث يقبل اثنين من المعلمات: اسم الملف الأصلي والاسم الجديد. Process.php تبدو وكأنها:
<?php
$file = $_GET['file'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename='.$_GET['newFile']);
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
2) إنشاء رابط على صفحة مواجهة المستخدم التي تشير إلى البرنامج النصي المعالج:
<a href="process.php?file=OriginalFile.pdf&newFile=MyRenamedFile.pdf">DOWNLOAD ME</a>
تحتاج إلى تعيين اسم الملف المطلوب في Content-Disposition
رأس:
$name = 'desiredname.pdf';
header('Content-Disposition: attachment;filename="' . $name . '"');
ولكن لسوء الحظ، لن يتم التقاط هذا بواسطة WebBrowser معين تم تطويره بواسطة فريق في Redmond. إذا كنت ترغب في الحصول عليها للعمل في هذا المتصفح كذلك، فأنت بحاجة إلى إلحاق اسم الملف نفسه كآخر جزء من مسار الطلب. علي سبيل المثال: http://example.com/pdf/desiredname.pdf
.
يتم تعريف اسم ملف المحتوى الذي يقدمه في رؤوس HTTP. انظر حول صفحة PHP على الرؤوس (أيضا التعليقات) لمزيد من المعلومات.
كنت أفعل شيئا مشابها منذ فترة واحدة، وتقديم الملفات من خلال PHP (في حالتي، وليس لإعادة تسميته، ولكن للتحقق من تسجيل الدخول إلى أن الشخص الذي يقوم بتنزيلها تم تسجيل الدخول وسمح لرؤية تلك الملفات). لقد وجدت أن تنزيلات PDF لم تنجح في IE إلا إذا أضفت أيضا هذه الرؤوس:
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');
لست متأكدا لماذا. تجربة ونرى ما يحدث.