إعادة تسمية ملف PDF المراد تحميلها عند الطيران

StackOverflow https://stackoverflow.com/questions/1826804

  •  11-09-2019
  •  | 
  •  

سؤال

معطى: جميع ملفات 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');

لست متأكدا لماذا. تجربة ونرى ما يحدث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top