เกี่ยวกับ Content-Type: download

วันนี้ปัญหามากหน่อย

ลองแบบนี้ดู

header("Content-Disposition: attachment; filename=" . urlencode(utf8_encode(basename(" . $file . "))));

โหลดได้แล้วครับ แต่เป็นแบบนี้ครับ

+.+ ชื่อไฟล์ +.+

ผมเลยลอง
header(“Content-Disposition: attachment; filename=” . urlencode(utf8_encode(basename(“$file”))));

ออกมาเป็น… ชื่อไฟล์

ไม่มี +.+ แล้ว

ส่วนชื่อนั้นเป็น %C3 %A2แบบนี้ แต่ตัวนี้ผมไม่ซีเรียสมากครับ เอาแค่โหลดไทยได้เป็นพอ

แต่ไฟล์ที่โหลดมานั้น ขนาดเป็น 0 ไบต์อ่ะครับ

ไฟล์ภาษาอังกฤษก็ 0 ไบต์จร้า

สำหรับชื่อไฟล์ ลองดูใหม่


header("Content-Disposition: attachment; filename=\"" . urlencode(utf8_encode(basename(" . $file . ")))\""); 

ส่วน 0 ไบต์อาจจะต้องหา function อื่นแทน readfile

Warning: Unexpected character in input: '' (ASCII=92) state=1 in C:\www\index.php on line 3

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\www\index.php on line 3

บรรทัดที่ 3
header(“Content-Disposition: attachment; filename="” . urlencode(utf8_encode(basename(" . $file . “)))"”);

ถ้า $file เป็นชื่อไฟล์อยู่แล้วก็ไม่เห็นจำเป็นต้อง basename() นี่ครับแล้วก็ IE กับ FF/Safari จะไม่เหมือนกันนะครับ

if(@preg_match("#MSIE#is", $_SERVER[‘HTTP_USER_AGENT’], $matches)){
@header(‘Content-Disposition: attachment; filename="’.rawurlencode($filename).’"’);
}else{
@header(‘Content-Disposition: attachment; filename="’.$filename.’"’);
}

ถ้าให้ชัวร์ก็ต้องมี double-quote คร่อมด้วยครับ

อันนี้เซฟเป็นไฟล์ไม่มีชื่อ ขนาด 0 ไบต์อ่ะครับ

ตอนนี้ผม งง ไปหมดและครับ ว่าโค้ดไหนใส่ตรงไหนอย่างไร ตอนนี้ที่ผมใช้คือ

<?
$file = $_POST['file'];
if(@preg_match("#MSIE#is", $_SERVER['HTTP_USER_AGENT'], $matches)){

โค๊ดที่ผมให้ไปตัดมาจากที่ใช้อยู่ตัวแปรมันเป็น $filename คุณต้องเปลี่ยนเป็น $file ด้วย ส่วนที่ได้ 0 byte นั้นตรวจสอบดูว่าไฟล์ยังอยู่ใน path ที่ระบุหรือไม่ หรือ header ส่วนของ Content-length ได้ขนาดถูกต้องหรือไม่

จริงๆแล้วถ้าชื่อไฟล์ในระบบกับไฟล์ที่ต้องการส่งไปยัง browser นั้นชื่อเดียวกันอยู่แล้วก็ไม่จำเป็นต้องเขียนยาวอย่างนี้ก็ได้ เขียนเพียง

$file = “นายไก่.doc”;
header(“Content-Type: application/force-download”);
readfile(" . $file . ");

ก็ได้เหมือนกันครับ

ผมปรับเป็น $file แล้วโหลดได้ แต่ขนาดไฟล์เท่ากับ 0 อ่ะครับ

ส่วน

$file = “นายไก่.doc”;
header(“Content-Type: application/force-download”);
readfile(" . $file . ");

อันนี้ไม่ได้เลยครับ

ขออภัยเืรื่องชื่อไฟล์ นึกได้ว่าจำผิดถ้าไม่ระบุ filename ใน header จะไม่ได้ชื่อไฟล์

ส่วนเรื่องได้ 0 byte นั้น อยากให้ทดลองตัดบรรทัด Content-length ออกดูก่อนครับ หรือถ้ายังไม่ได้ให้ตัด header ทั้งหมดออกเหลือแต่ readfile ว่ายังได้ข้อมูลแสดงออกมาหรือไม่ (ส่วนตัวว่ามีปัญหาเรื่องการอ้างอิง path มากกว่า)

[quote author=InterServer.Asia-คุณภาพต้องมาก่อน link=topic=28519.msg266990#msg266990 date=1277650520]

จุดประสงค์นั้น อยากให้มันโหลดไฟล์ภาษาไทยได้ครับ

พื้นฐานสุดที่ลอง Load มันไม่โหลดแฮะ

ไฟล์มันจะมีหลายนามสกุลจะต้องเป็นคำสั่งไหนครับคุณไอซ์ พอดีจะมีเป็น .rar .pdf และอื่นๆอีกอ่ะครับ

ก็ใส่ไปให้หมดเลยครับ

AddType application/force-download .doc .rar .pdf .xxx .yyy .zzz

mod deflate ใน apache มันจะทำให้ไม่ขึ้นขนาดไฟล์นี่ครับ ต้องเพิ่มสกุลในนั้นด้วย