การอัปโหลดไฟล์ด้วย Fetch
ส่งไฟล์ไปยังเซิร์ฟเวอร์ด้วย FormData
การอัปโหลดไฟล์ด้วย Fetch เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
การอัปโหลดด้วยการส่งคำขอ
เมื่อต้องการส่งไฟล์ไปยังเซิร์ฟเวอร์ ให้ส่งเนื้อหา FormData ด้วยคำขอแบบ fetch POST เบราว์เซอร์จะจัดการการเข้ารหัส multipart/form-data ให้คุณ รวมถึงเนื้อหาไฟล์
การสร้าง FormData
รวบรวมไฟล์จากช่องป้อนข้อมูล แล้วเพิ่มไฟล์นั้นพร้อมกับช่องข้อมูลอื่น ๆ ลงในออบเจ็กต์ FormData
const file = document.querySelector('#picker').files[0];
const data = new FormData();
data.append('avatar', file);
data.append('userId', '42');
console.log(data.has('avatar'));คำขอ POST พื้นฐาน
ส่ง FormData เป็น body ของคำขอ fetch แบบ POST คำตอบที่ได้เป็นพรอมิสซึ่งคุณสามารถรอด้วย await ได้
async function upload(data) {
const response = await fetch('/api/upload', {
method: 'POST',
body: data
});
console.log(response.status);
}อย่ากำหนด Content-Type
ข้อผิดพลาดที่พบบ่อยคือการกำหนด Content-Type ด้วยตนเอง ปล่อยให้เบราว์เซอร์กำหนดค่าให้ เพราะต้องใส่สตริง ขอบเขต ของข้อมูลแบบหลายส่วนด้วย หากกำหนดเอง การอัปโหลดจะไม่ทำงาน
const response = await fetch('/api/upload', {
method: 'POST',
body: formData
});
console.log('browser added the boundary automatically');การอ่านคำตอบ
ตรวจสอบ response.ok และวิเคราะห์เนื้อหา ซึ่งมักเป็นข้อมูลเจสัน หลังจากอัปโหลดสำเร็จ
async function upload(data) {
const response = await fetch('/api/upload', { method: 'POST', body: data });
if (!response.ok) {
throw new Error('upload failed: ' + response.status);
}
const result = await response.json();
console.log(result);
}การจัดการข้อผิดพลาด
ครอบการเรียกใช้ด้วย try/catch โปรดทราบว่าการเรียกใช้จะปฏิเสธเฉพาะเมื่อเกิดความล้มเหลวของเครือข่าย ดังนั้นคุณต้องตรวจสอบ response.ok สำหรับสถานะข้อผิดพลาดของ HTTP
async function upload(data) {
try {
const res = await fetch('/api/upload', { method: 'POST', body: data });
if (!res.ok) throw new Error('HTTP ' + res.status);
console.log('uploaded');
} catch (err) {
console.log('error:', err.message);
}
}การอัปโหลดหลายไฟล์
เพิ่มไฟล์หลายไฟล์ภายใต้คีย์เดียวกันด้วย append หรือวนซ้ำรายการไฟล์เพื่อเพิ่มไฟล์ทั้งหมด
const files = document.querySelector('#picker').files;
const data = new FormData();
for (const file of files) {
data.append('photos', file);
}
console.log(data.getAll('photos').length + ' files queued');การเพิ่มส่วนหัว เช่น การยืนยันตัวตน
คุณสามารถเพิ่มส่วนหัว เช่น Authorization ได้ แต่ห้ามเพิ่ม Content-Type เนื้อหาคำขอยังคงเป็น FormData
const response = await fetch('/api/upload', {
method: 'POST',
headers: { Authorization: 'Bearer token123' },
body: formData
});
console.log(response.status);การส่งออบเจ็กต์ไบนารีที่สร้างขึ้น
คุณสามารถอัปโหลดข้อมูลที่สร้างขึ้นในเบราว์เซอร์ได้ ไม่จำเป็นต้องเป็นไฟล์ที่เลือกเท่านั้น ให้เพิ่มออบเจ็กต์ไบนารีพร้อมชื่อไฟล์เพื่อส่งเอกสารที่สร้างขึ้น
const blob = new Blob([JSON.stringify({ ok: true })], {
type: 'application/json'
});
const data = new FormData();
data.append('report', blob, 'report.json');
await fetch('/api/upload', { method: 'POST', body: data });
console.log('generated file sent');การยกเลิกการอัปโหลด
ใช้ AbortController เพื่อยกเลิกการอัปโหลดที่ช้า เช่น เมื่อผู้ใช้ออกจากหน้านี้
const controller = new AbortController();
fetch('/api/upload', {
method: 'POST',
body: formData,
signal: controller.signal
}).catch(e => console.log(e.name));
controller.abort();เหตุใดเรื่องนี้จึงสำคัญ
การใช้ FormData ร่วมกับการส่งคำขอเป็นวิธีมาตรฐานสมัยใหม่สำหรับอัปโหลดไฟล์ ให้เพิ่มช่องข้อมูลและไฟล์ ส่ง FormData แบบ POST แล้วปล่อยให้เบราว์เซอร์เข้ารหัสข้อมูลแบบหลายส่วนพร้อมขอบเขตที่ถูกต้อง หลีกเลี่ยงการกำหนด Content-Type ตรวจสอบ response.ok เสมอ และทำความสะอาดทรัพยากร
async function submitForm(formEl) {
const data = new FormData(formEl);
const res = await fetch('/submit', { method: 'POST', body: data });
console.log('status', res.status);
}ตรวจสอบความเข้าใจ
เหตุใดคุณจึงไม่ควรกำหนดส่วนหัว Content-Type ด้วยตนเองเมื่อส่ง FormData แบบ POST ด้วย fetch
ทบทวน: การอัปโหลดไฟล์ด้วยการส่งคำขอ
คุณได้เรียนรู้การส่งไฟล์ไปยังเซิร์ฟเวอร์ดังนี้
- เพิ่มไฟล์และช่องข้อมูลลงใน FormData แล้วส่งเป็น
bodyของการเรียกใช้ fetch - อย่ากำหนด
Content-Typeด้วยตนเอง เบราว์เซอร์จะเพิ่มขอบเขตของข้อมูลแบบหลายส่วนให้ - ตรวจสอบ
response.okเพราะ fetch จะปฏิเสธเฉพาะเมื่อเกิดข้อผิดพลาดของเครือข่าย - คุณสามารถส่งหลายไฟล์ ออบเจ็กต์ไบนารีที่สร้างขึ้น และยกเลิกการอัปโหลดด้วย
AbortControllerได้
เรียนรู้ JavaScript ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 59
- บทเรียน
- 200
คำถามที่พบบ่อย
บทเรียน “การอัปโหลดไฟล์ด้วย Fetch” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอัปโหลดไฟล์ด้วย Fetch” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอัปโหลดไฟล์ด้วย Fetch”
ส่งไฟล์ไปยังเซิร์ฟเวอร์ด้วย FormData คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การอัปโหลดไฟล์ด้วย Fetch” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ออบเจ็กต์ FormData
- การอ่านไฟล์ด้วย FileReader
- Blob และ URL ของออบเจ็กต์
- การอัปโหลดไฟล์ด้วย Fetch