React Academy · Oppitunti

Tiedostojen lataaminen backend-rajapintaan

Käyttäkää FormDataa ja fetchiä tiedostojen lähettämiseen POST-pyynnöllä ja latauksen edistymisen seurantaan.

Oppitunti 4/413 vaihetta

Tiedostojen lataaminen backend-rajapintaan on ilmainen React Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu React Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. React Academy-kurssilla on yhteensä 4 oppituntia.

Tervetuloa

Tässä oppitunnissa käytätte FormData APIa ja fetchiä tiedostojen lähettämiseen POST-pyynnöllä taustajärjestelmään, seuraatte latauksen edistymistä XMLHttpRequestillä ja näytätte latauksen tilan Reactissa.

FormData API

FormData on selain-API, joka muodostaa multipart/form-data-pyyntöjen rungot — juuri sen muodon, jota palvelimet odottavat tiedostojen lataamista varten. Liittäkää tiedosto ja mahdolliset metatietokentät FormData-objektiin.
const formData = new FormData();
formData.append('file', selectedFile);
formData.append('description', 'Profile photo');

Lataaminen fetchillä

Välittäkää FormData-objekti fetchin rungoksi. ÄLKÄÄ asettako Content-Type-otsaketta itse — selain määrittää oikean multipart-rajauksen automaattisesti.
const response = await fetch('/api/upload', {
  method: 'POST',
  body: formData,
  // Do not set Content-Type header here!
});

Latauksen tilan hallinta

Seuratkaa latauksen tilaa kolmella tilamuuttujalla: `uploading` (totuusarvo), `progress` (0–100) ja `error` (merkkijono tai null). Näyttäkää latausilmaisimet, edistymispalkit ja virheilmoitukset näiden arvojen perusteella.
const [uploading, setUploading] = useState(false);
const [progress, setProgress] = useState(0);
const [error, setError] = useState(null);

Latauksen edistyminen XMLHttpRequestillä

Fetch API ei tue latauksen edistymistapahtumia. Käyttäkää XMLHttpRequestin `upload.onprogress`-tapahtumaa prosenttipäivitysten saamiseen.
const xhr = new XMLHttpRequest();
xhr.upload.onprogress = (e) => {
  if (e.lengthComputable) {
    setProgress(Math.round((e.loaded / e.total) * 100));
  }
};
xhr.open('POST', '/api/upload');
xhr.send(formData);

XHR:n kääriminen Promiseen

Käärikää XMLHttpRequest-kutsu Promiseen, jotta voitte käyttää awaitia ja async/await-virheenkäsittelyä.
function uploadFile(file) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.onload = () => resolve(xhr.response);
    xhr.onerror = () => reject(new Error('Upload failed'));
    xhr.upload.onprogress = (e) => setProgress(Math.round(e.loaded / e.total * 100));
    xhr.open('POST', '/api/upload');
    xhr.send(new FormData().set && (() => { const f = new FormData(); f.append('file', file); xhr.send(f); })());
  });
}

Palvelimen vastauksen käsittely

Jäsentäkää palvelimen JSON-vastaus onnistuneen latauksen jälkeen. Päivittäkää käyttöliittymän tila palautetulla URL-osoitteella tai ID:llä.
const res = await fetch('/api/upload', { method: 'POST', body: fd });
if (!res.ok) throw new Error('Upload failed');
const { url } = await res.json();
setUploadedUrl(url);

Virheenkäsittely

Käsitelkää aina verkko- ja palvelinvirheet. Näyttäkää käyttäjäystävällinen virheilmoitus ja sallikaa yrittäminen uudelleen. Nollatkaa progress- ja uploading-tila catch-lohkossa.
try {
  setUploading(true);
  await uploadToServer(file);
} catch (err) {
  setError(err.message);
} finally {
  setUploading(false);
}

Latauksen peruuttaminen

Käyttäkää AbortControlleria fetchin kanssa käynnissä olevan latauksen peruuttamiseen. Tallentakaa ohjain refiin, jotta voitte kutsua abort()-metodia peruutuspainikkeesta.
const abortRef = useRef();

const start = async () => {
  abortRef.current = new AbortController();
  await fetch('/api/upload', { body: fd, signal: abortRef.current.signal });
};
const cancel = () => abortRef.current?.abort();

Useiden tiedostojen lataaminen

Ladatkaa useita tiedostoja rinnakkain Promise.allin avulla tai peräkkäin for-of-silmukalla. Seuratkaa kunkin tiedoston edistymistä erikseen tiedostonimen mukaan avaimistetulla objektilla.

Pikatarkistus

Miksi Content-Type-otsaketta EI pidä asettaa itse, kun fetchiä käytetään FormDatan kanssa?

Kertaus

Käyttäkää FormDataa latausten pyyntöaineistojen muodostamiseen. Käyttäkää fetchiä ilman Content-Type-otsaketta, jotta selain lisää rajauksen automaattisesti. Seuratkaa edistymistä XMLHttpRequestin upload.onprogress-tapahtumalla. Käsitelkää virheet hallitusti ja tukekaa peruuttamista AbortControllerilla.

Kurssi suoritettu

Onneksi olkoon! Suorititte kurssin **Kontrolloimattomat komponentit ja tiedostojen lataaminen**. Osaatte nyt käsitellä kontrolloimattomia syötteitä, tiedostojen valintaa, vedä ja pudota -toimintoja sekä multipart-latauksia edistymisen seurannalla.
Aloita maksutta

Opi React tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
88
Oppitunnit
324

Usein kysytyt kysymykset

Onko oppitunti ”Tiedostojen lataaminen backend-rajapintaan” ilmainen?

Kyllä – oppitunnin ”Tiedostojen lataaminen backend-rajapintaan” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko React Academy-kurssin, päivitä CoddyKit PROhon. React Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tiedostojen lataaminen backend-rajapintaan”?

Käyttäkää FormDataa ja fetchiä tiedostojen lähettämiseen POST-pyynnöllä ja latauksen edistymisen seurantaan. Harjoittelet React Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni React Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin React Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Tiedostojen lataaminen backend-rajapintaan”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä React Academy-oppitunnilla?

Kyllä. Jokainen React Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Hallitsemattomat syötteet useRefillä
  2. Tiedostosyöte ja tiedostotietojen lukeminen
  3. Vedä ja pudota -tiedostolatauksen käyttöliittymä
  4. Tiedostojen lataaminen backend-rajapintaan
← Takaisin: React Academy