วันก่อนต้องเขียน API endpoint นึงแต่ไม่ใช่ ตอบกลับเป็น JSON แต่จะตอบเป็น content ของ PDF แทน ซึ่งเราอยากให้เมื่อกดลิ้งมาที่ endpoint นี้จากทาง browser แล้วให้ browser นั้นโหลดไฟล์ แทนที่จะเปิดไฟล์ผ่าน browser
วิธีที่ช่วยได้คือกำหนดค่าให้กับ header ที่ชื่อ Content-Disposition
เรามาดูตัวอย่างธรรมดากันก่อนแบบไม่ใช้ Content-Disposition
ว่าพฤติกรรมของ browser นั้นเป็นยังไง ตัวอย่างเป็นโค้ด Go
ถ้าเรามีโค้ดแบบนี้
package main import ( "log" "net/http" "os" ) func main() { http.HandleFunc("/cat.jpg", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "image/jpeg") b, err := os.ReadFile("image.jpg") if err != nil { log.Fatal(err) } w.Write(b) }) http.HandleFunc("/index.html", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") b, err := os.ReadFile("index.html") if err != nil { log.Fatal(err) } w.Write(b) }) http.ListenAndServe(":8000", nil) }
และส่วนของ index.html
เป็นแบบนี้
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Load</title> </head> <body> <a href="/cat.jpg">Download Picture</a> </body> </html>
เมื่อรันโค้ดแล้วเข้าไปที่ localhost:8000/index.html
จะเจอลิ้ง download แบบนี้
และเมื่อเรากดลิ้งจะเห็นว่า browser นั้นเปิดใน browser เลยแบบนี้
ทีนี้ถ้าเราต้องการให้ browser โหลดไฟล์แทนเราสามารถกำหนด header Content-Disposition
ไปแบบนี้
package main import ( "log" "net/http" "os" ) func main() { http.HandleFunc("/cat.jpg", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "image/jpeg") w.Header().Set("Content-Disposition", `attachment; filename="cat.png"`) b, err := os.ReadFile("image.jpg") if err != nil { log.Fatal(err) } w.Write(b) }) http.HandleFunc("/index.html", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") b, err := os.ReadFile("index.html") if err != nil { log.Fatal(err) } w.Write(b) }) http.ListenAndServe(":8000", nil) }
ส่วนค่าของ header คือกำหนดเป็น
`attachment; filename="cat.png"`
ตรง filename
คือกำหนดชื่อไฟล์ที่จะให้ browser ใช้เซฟตอน download นั่นเอง
ขอฝาก Buy Me a Coffee
สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ
ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth
ขอบคุณครับ 🙏
Top comments (0)