JavaScript Academy · บทเรียน

การอัปโหลดไฟล์ด้วย Fetch

ส่งไฟล์ไปยังเซิร์ฟเวอร์ด้วย FormData

บทเรียน 4 จาก 413 ขั้นตอน

การอัปโหลดไฟล์ด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ออบเจ็กต์ FormData
  2. การอ่านไฟล์ด้วย FileReader
  3. Blob และ URL ของออบเจ็กต์
  4. การอัปโหลดไฟล์ด้วย Fetch
← กลับไปที่ JavaScript Academy