พึ่งเคยใช้งานครั้งแรกโปรดอ่านที่นี่! howtouse!
x
  • Register
หางานด้าน IT อยู่เหรอ?

[PHP] การเขียน php script เพื่อ dowload file

+1 vote

การเขียน php script เพื่อ dowload file

ไม่ว่าจะเป็น ลิงค์ หรือ ปุ่ม บนหน้าเว็บ สำหรับกดเพื่อดาวน์โหลดไฟล์อะไรบางอย่าง

สมมติว่า กดแล้ว จะลิงค์มายัง ไฟล์ download.php

 

ซึ่งในไฟล์นี้เราจะเขียน เช็คโน้น เช็คนี่ บันทึกสถิติการดาวน์โหลด หรือ อะไรก็ว่าไป

พอหลังจากตรวจสอบอะไรทุกอย่างเสร็จแล้ว

เราจะต้องเขียน คำสั่งในการ เริ่มต้นดาวน์โหลด

จากที่เคยทดลองเขียน (เหมือนจะได้)

 

header('Content-Description: File Transfer');

//สมมติผมจะให้ดาวน์โหลด ไฟล์ .exe

header('Content-Type: 'application/octet-stream.'');

header('Content-Length: '.filesize("ไฟล์ Path เต็ม"));

header('Content-Disposition: attachment; filename='.basename("ชื่อไฟล์"));

 

readfile("ไฟล์ Path เต็ม");

 

ตอนนี้ได้ Warning ดังนี้ครับ

 

Warning: Cannot modify header information - headers already sent

 

 

อยากทราบว่ามีวิธีอื่นอีกรึป่าวครับ หรือ วิธีแก้ไขไหม

 

 

ถามเมื่อ May 24, 2012 in PHP & MySQL & Ajax โดย phanithanj (1,139 คะแนน)
edited May 25, 2012 โดย phanithanj
   

2 Answers

+1 vote
วิธีอื่นที่ว่า หมายถึง ไม่ใช้ function header หรือครับ
ถ้าแบบนั้นผมว่า ไม่มีนะ เพราะ header ที่เห็นคือ HTTP header ที่ส่งกลับไปทาง browser
Content-Type บอกว่าจะส่งอะไรกลับไป ถ้าเป็น application/octet-stream ก็จะขึ้น dialog ให้ download, แต่ถ้าเป็น application/pdf ถ้าที่ client ลง application ที่ดู pdf ได้ก็จะเปิด application นั้นขึ้นมา แต่ถ้าไม่มีก็จะเป็น dialog
Content-Disposition: attachment; filename= ใช้บอกว่า ถ้าเป็น dialog เพื่อ save จะให้ save ไฟล์เป็นชื่ออะไร

ภาษาอื่นก็เหมือนกัน เพียงแต่อาจจะมี function ครอบอีกที
หรือถ้าเป็น C# ก็ Response.AddHeader แล้วใส่ HTTP header
ตอบเมื่อ May 25, 2012 โดย Krurkrit Phoosakul (1,174 คะแนน)
อ่อครับผม ตามนั้นแหละครับ

แต่ตอนนี้ของผมมันไม่ขึ้น Dialog ดาวน์โหลด เนี่ยแหละปัญหา

ขึ้น

Warning: Cannot modify header information - headers already sent
ถ้าขึ้นแบบนั้นแสดงว่า Encode php เป็น UTF-8 ทำให้มี BOM อยู่ต้น file(มองไม่เห็นแต่รู้สึกได้ 555+) ลองใช้ Notepad เปิด แล้วบันทึกเป็น ANSI ดูครับ

หรือไม่ก็ลองตรวจดูก่อนว่า ก่อนใช้ header ได้มีการใช้คำสั่งแสดงผลเช่นพวก echo กับ print หรือไม่ถ้ามีให้ย้ายลงมาใต้ header (รวมถึง flush ob_flush และ ob_end_flush)
ใช่ครับ ผมตั้งเป็น UTF-8 ครับ

ผมเรียกใช้ header นี้ท้ายๆ เลยครับ ก่อนหน้านั้น มีอะไรมากมายเต็มไปหมด
สรุปคือ header ต้องอยู่บนสุด

ต้องให้อยู่บน sessino_start(); ด้วยรึป่าวครับ
เป็น utf-8 ต้องแก้เป็น ANSI หรือไม่ถ้าใช้ Notepad++ ต้องตั้งเป็น UTF8 Without BOM ครับ

คำสั่ง header กับ session_start ค่าเท่ากันเอาอะไรขึ้นก่อนก็ได้ครับ
ถ้าไม่แก้เรื่อง UTF-8 แต่เอาไปไว้บนสุด จะได้ไหมหว่า

เดียวต้องลอง

เพราะยังไงก็ต้องเป็น UTF-8 เพราะผมใส่ meta เป็น UTF-8 ไว้แล้ว
พอดี ไฟล์ dowload.php ผม เป็นการเรียกแบบ Ajax

แต่พอผมใส่

<a href='download.php'>Download</a>

แบบตรงๆ แบบนี้ มันดันใช้ได้ เฉยๆ ??
0 votes
ต้องมีการปริ้นท์ข้อความอะไรสักอย่าง ก่อน header แน่ๆ แบบนี้ ลองให้มันโชว์ error  ดูครับ

เอาไปใส่ไว้ หน้าเพจที่เราต้องการ debug ดูก่อน ครับ

@ini_set('display_errors','1');
ตอบเมื่อ May 28, 2012 โดย Wisit Paew (247 คะแนน)

Related questions

0 votes
5 คำตอบ
+1 vote
4 คำตอบ
416 views ถามเมื่อ May 16, 2012 in PHP & MySQL & Ajax โดย Puppa Max (103 คะแนน)
+1 vote
2 คำตอบ
367 views ถามเมื่อ Oct 10, 2013 in PHP & MySQL & Ajax โดย Nattawat Marsh (103 คะแนน)
...