ด้วยการตั้งค่า Content-Type เป็น application/octet-stream เนื้อหาที่สร้างขึ้นแบบไดนามิกจะสามารถดาวน์โหลดเป็นไฟล์ได้ ฉันเชื่อว่าทุกคนรู้สิ่งนี้ จากนั้นใช้ Content-Disposition เพื่อตั้งชื่อไฟล์ที่ดาวน์โหลด หลายคนรู้เรื่องนี้ โดยพื้นฐานแล้ว โปรแกรมดาวน์โหลดจะเขียนดังนี้:
<?php$filename = “document.txt”;header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print “Hello!”;?>หลังจากเปิดด้วยเบราว์เซอร์แล้ว คุณสามารถดาวน์โหลด document.txt ได้
อย่างไรก็ตาม หาก $filename มีการเข้ารหัส UTF-8 เบราว์เซอร์บางตัวจะไม่สามารถจัดการได้อย่างถูกต้อง ตัวอย่างเช่น เปลี่ยนโปรแกรมด้านบนเล็กน้อย:
<?php$filename = "Thai file name.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print “Hello!”;?> หากคุณบันทึกโปรแกรมด้วยการเข้ารหัส UTF-8 แล้วเข้าถึง ชื่อไฟล์ที่ดาวน์โหลดโดย IE6 จะถูกอ่านไม่ออก ชื่อไฟล์ที่ดาวน์โหลดภายใต้ FF3 จะมีคำว่า "ภาษาจีน" เท่านั้น ทุกอย่างทำงานได้ดีภายใต้ Opera 9
ส่วนหัวของเอาต์พุตมีลักษณะดังนี้:
Content-Disposition: attachment; filename=Thai file name.txt ตามคำจำกัดความของ RFC2231 การเข้ารหัสหลายภาษา Content-Disposition ควรถูกกำหนดดังนี้:
Content-Disposition: attachment ; filename*=”utf8 "%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" หมายถึง:
เพิ่ม * ก่อนเครื่องหมายเท่ากับ หลังชื่อไฟล์
ค่าของชื่อไฟล์แบ่งออกเป็นสามส่วนด้วยเครื่องหมายคำพูดเดี่ยว ซึ่งได้แก่ ชุดอักขระ (utf8) ภาษา (ว่าง) และชื่อไฟล์ที่เข้ารหัส urlencoded
วิธีที่ดีที่สุดคือเพิ่มเครื่องหมายคำพูดคู่ มิฉะนั้นส่วนหลังช่องว่างในชื่อไฟล์จะไม่ปรากฏใน Firefox โปรดทราบว่าผลลัพธ์ของ urlencode จะไม่เหมือนกับผลลัพธ์ของฟังก์ชัน urlencode ของ PHP จะแทนที่ช่องว่างด้วย + และที่นี่จะต้องแทนที่ด้วย %20
หลังจากการทดสอบพบว่าการรองรับเบราว์เซอร์หลักหลายตัวมีดังนี้:
ไฟล์แนบ IE6; filename="<ชื่อไฟล์ UTF-8 หลังจากการเข้ารหัส URL>"
ไฟล์แนบ FF3; filename="UTF-8 file name"
ไฟล์แนบ; ชื่อไฟล์*=”utf8”<ชื่อไฟล์ UTF-8 หลังจากการเข้ารหัส URL>”
ไฟล์แนบ O9; filename="UTF-8 file name"
ดูเหมือนว่า Safari3(Win) จะไม่รองรับใช่ไหม วิธีการข้างต้นไม่ได้ผล
ดูเหมือนว่าโปรแกรมจะต้องเขียนเช่นนี้เพื่อรองรับเบราว์เซอร์กระแสหลักทั้งหมด:
<?php$ua = $_SERVER["HTTP_USER_AGENT"];$filename = "Thai file name.txt";$encoded_filename = urlencode( $filename);$encoded_filename = str_replace("+", "%20", $encoded_filename);header('Content-Type: application/octet-stream');if (preg_match("/MSIE/", $ua) ) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');} else if (preg_match("/Firefox/", $ua)) { header('เนื้อหา-การจัดการ : attachment; filename*=”utf8'” . $filename . '"');} else { header('Content-Disposition: attachment; filename=”' . $filename . '"');} พิมพ์ 'ABC ';? >