recherche
Maisoninterface Webjs tutorielReact & Expo - Comment télécharger et télécharger des fichiers

Introduction

J'ai eu du mal à trouver des exemples clairs sur la façon de télécharger et de télécharger des fichiers dans une application mobile basée sur Expo. Pour aider les autres confrontés au même défi – ou toute personne simplement curieuse – j'ai écrit cet article.

En cours de route, nous explorerons les concepts clés qu'il est utile de comprendre :

  • Tampons
  • Filtres d'intention
  • Types MIME
  • application/octet-stream
  • multipart/form-data
  • Et plus encore...

Ce que nous couvrirons :

  • Envoi et réception de fichiers avec un serveur Fastify.
  • Téléchargement, téléchargement et affichage de fichiers sur une application Web React.
  • Téléchargement, téléchargement et affichage de fichiers sur une application mobile React Native (Expo).

Tous les codes et la collection Postman sont disponibles dans mon GitHub.

Serveur

React & Expo - How to Upload & Download Files

Le serveur fonctionne sur Fastify (une version modernisée d'Express.js). Pour démarrer l'application, procédez comme suit :

  1. À l'aide du terminal, accédez à /server
  2. Installez les dépendances avec npm install
  3. Exécutez le serveur en utilisant npm run dev

Dans app.js, nous avons trois points de terminaison clés :

- Télécharger le point de terminaison (/download)

fastify.get("/download", async function handler(_, reply) {
  const fd = await open(FILE_TO_DOWNLOAD);
  const stream = fd.createReadStream();

  const mimeType = mime.lookup(FILE_TO_DOWNLOAD);

  console.log(`Downloading -> ${FILE_TO_DOWNLOAD}`);

  return reply
    .type(mimeType)
    .header(
      "Content-Disposition",
      `attachment; filename=${path.basename(FILE_TO_DOWNLOAD)}`
    )
    .send(stream);
});

Ce point de terminaison envoie example.webp sous forme de flux à l'aide de createReadStream(). Le type MIME est inclus afin que le client sache comment gérer le fichier. Par exemple.webp, ce sera image/webp.

?Remarque : Le type MIME définit le format du fichier envoyé. Cela aide le client à l'afficher correctement.
Voir plus de types MIME.

L'en-tête Content-Disposition définit comment le contenu doit être présenté au client. Y compris la pièce jointe ; nom de fichier= invite le navigateur à télécharger le fichier plutôt que de l'afficher en ligne. Pour l'afficher directement, utilisez en ligne au lieu de pièce jointe.
En savoir plus sur la disposition du contenu

React & Expo - How to Upload & Download Files

- Téléchargez plusieurs fichiers à l'aide de données de formulaire (/upload-multiples)

fastify.post("/upload-multiples", async function handler(request) {
  const parts = request.files();
  const uploadResults = [];

  for await (const file of parts) {
    const fileBuffer = await file.toBuffer();
    const filename = file.filename;
    const filePath = path.join(DIR_TO_UPLOAD, filename);

    await writeFile(filePath, fileBuffer);
    uploadResults.push({ filename, uploaded: true });
    console.log(`Uploaded -> ${filePath}`);
  }

  return { uploadedFiles: uploadResults };
});

Ce point de terminaison accepte une requête multipart/form-data. Il :

  1. Récupère les fichiers de la requête.
  2. Convertit chaque fichier en tampon (une représentation JavaScript de données binaires).
  3. Enregistre le fichier dans le répertoire /upload.

Par exemple, une demande pourrait ressembler à ceci :

React & Expo - How to Upload & Download Files

- Télécharger des fichiers à l'aide d'Octet Stream (/upload-octet-stream)

fastify.get("/download", async function handler(_, reply) {
  const fd = await open(FILE_TO_DOWNLOAD);
  const stream = fd.createReadStream();

  const mimeType = mime.lookup(FILE_TO_DOWNLOAD);

  console.log(`Downloading -> ${FILE_TO_DOWNLOAD}`);

  return reply
    .type(mimeType)
    .header(
      "Content-Disposition",
      `attachment; filename=${path.basename(FILE_TO_DOWNLOAD)}`
    )
    .send(stream);
});

Ce point de terminaison attend un seul fichier binaire dans le corps de la requête (application/octet-stream). Contrairement à multipart/form-data, le fichier est déjà une donnée binaire, nous pouvons donc l'écrire directement sur le disque.

La demande ressemblera à ceci dans Postman :

React & Expo - How to Upload & Download Files

React & Expo - How to Upload & Download Files

Web (Réagir)



React & Expo - How to Upload & Download Files

Pour exécuter l'application :

  1. À l'aide du terminal, accédez à /web
  2. Installez les dépendances avec npm install
  3. Démarrez l'application en utilisant npm run dev

Toutes les fonctionnalités de l'application Web sont contenues dans App.tsx :

React & Expo - How to Upload & Download Files

Cette application React offre trois fonctionnalités clés :

- Télécharger/Afficher le fichier

fastify.post("/upload-multiples", async function handler(request) {
  const parts = request.files();
  const uploadResults = [];

  for await (const file of parts) {
    const fileBuffer = await file.toBuffer();
    const filename = file.filename;
    const filePath = path.join(DIR_TO_UPLOAD, filename);

    await writeFile(filePath, fileBuffer);
    uploadResults.push({ filename, uploaded: true });
    console.log(`Uploaded -> ${filePath}`);
  }

  return { uploadedFiles: uploadResults };
});

Lorsque l'utilisateur clique sur le bouton "Télécharger", l'application :

  1. Appelle le point de terminaison /download.
  2. Reçoit le fichier sous forme de blob binaire.
  3. Crée une URL d'objet à partir du blob, agissant comme une URL temporaire à laquelle le navigateur peut accéder.

Le comportement dépend de l'en-tête Content-Disposition renvoyé par le serveur :

  • Si Content-Disposition inclut inline, le fichier est affiché dans un nouvel onglet.
  • S'il inclut une pièce jointe, le fichier est téléchargé automatiquement.

Pour déclencher le téléchargement, l'application crée un fichier avec le href défini sur l'objectURL et clique dessus par programme, simulant une action de téléchargement de l'utilisateur.

- Télécharger un fichier à l'aide des données du formulaire

fastify.post("/upload-octet-stream", async function handler(request) {
  const filename = request.headers["x-file-name"] ?? "unknown.text";

  const data = request.body;
  const filePath = path.join(DIR_TO_UPLOAD, filename);

  await writeFile(filePath, data);

  return { uploaded: true };
});

Lorsque le bouton « Télécharger le fichier » est cliqué :

  1. La fonction uploadFile s'exécute, créant un élément et simulant un clic d'utilisateur.
  2. Une fois que l'utilisateur sélectionne un ou plusieurs fichiers, ces fichiers sont ajoutés à un objet FormData.
  3. La requête est envoyée au point de terminaison /upload-multiples, qui accepte les fichiers via multipart/form-data.

Cela permet au serveur de gérer et d'enregistrer correctement les fichiers téléchargés.

- Télécharger des fichiers à l'aide d'Octet Stream

  const downloadFile = async () => {
    const response = await fetch(DOWNLOAD_API);

    if (!response.ok) throw new Error("Failed to download file");

    const blob = await response.blob();

    const contentDisposition = response.headers.get("Content-Disposition");

    const isInline = contentDisposition?.split(";")[0] === "inline";
    const filename = contentDisposition?.split("filename=")[1];

    const url = window.URL.createObjectURL(blob);

    if (isInline) {
      window.open(url, "_blank");
    } else {
      const a = document.createElement("a");
      a.href = url;
      a.download = filename || "file.txt";
      a.click();
    }

    window.URL.revokeObjectURL(url);
  };

Cette approche est plus simple que d'utiliser multipart/form-data : envoyez simplement le fichier directement dans le corps de la requête sous forme de données binaires et incluez le nom du fichier dans les en-têtes de la requête.

Mobile (Expo)



React & Expo - How to Upload & Download Files

Vous pouvez démarrer l'application avec ce qui suit :

  1. Accédez à l'annuaire mobile dans votre terminal.
  2. Installer les dépendances : npm install
  3. Exécutez le projet avec npm run android ou npm run ios

La logique principale est dans App.tsx où elle restitue ce qui suit :

fastify.get("/download", async function handler(_, reply) {
  const fd = await open(FILE_TO_DOWNLOAD);
  const stream = fd.createReadStream();

  const mimeType = mime.lookup(FILE_TO_DOWNLOAD);

  console.log(`Downloading -> ${FILE_TO_DOWNLOAD}`);

  return reply
    .type(mimeType)
    .header(
      "Content-Disposition",
      `attachment; filename=${path.basename(FILE_TO_DOWNLOAD)}`
    )
    .send(stream);
});

Pour afficher le fichier dans une nouvelle vue (comme lorsque le navigateur ouvre le fichier dans un nouvel onglet), nous devons lire la réponse sous forme de blob, puis la transformer en base64 à l'aide de FileReader.

Nous écrivons le fichier dans le répertoire cache (un répertoire privé auquel seule l'application a accès), puis l'affichons à l'aide d'IntentLauncher ou de Sharing si l'utilisateur utilise iOS.

- Télécharger le fichier

fastify.post("/upload-multiples", async function handler(request) {
  const parts = request.files();
  const uploadResults = [];

  for await (const file of parts) {
    const fileBuffer = await file.toBuffer();
    const filename = file.filename;
    const filePath = path.join(DIR_TO_UPLOAD, filename);

    await writeFile(filePath, fileBuffer);
    uploadResults.push({ filename, uploaded: true });
    console.log(`Uploaded -> ${filePath}`);
  }

  return { uploadedFiles: uploadResults };
});

Ceci est similaire au processus Web mais nous devons lire le blob en base64 à l'aide de FileReader, puis demander l'autorisation de télécharger le fichier là où l'utilisateur souhaite enregistrer le fichier.

- Télécharger un fichier à l'aide des données du formulaire

fastify.post("/upload-octet-stream", async function handler(request) {
  const filename = request.headers["x-file-name"] ?? "unknown.text";

  const data = request.body;
  const filePath = path.join(DIR_TO_UPLOAD, filename);

  await writeFile(filePath, data);

  return { uploaded: true };
});

Utilisez DocumentPicker pour permettre aux utilisateurs de sélectionner des fichiers, puis utilisez FormData pour ajouter les fichiers sélectionnés à la demande. Le processus est très simple.

- Télécharger le fichier sous forme de flux d'octets

  const downloadFile = async () => {
    const response = await fetch(DOWNLOAD_API);

    if (!response.ok) throw new Error("Failed to download file");

    const blob = await response.blob();

    const contentDisposition = response.headers.get("Content-Disposition");

    const isInline = contentDisposition?.split(";")[0] === "inline";
    const filename = contentDisposition?.split("filename=")[1];

    const url = window.URL.createObjectURL(blob);

    if (isInline) {
      window.open(url, "_blank");
    } else {
      const a = document.createElement("a");
      a.href = url;
      a.download = filename || "file.txt";
      a.click();
    }

    window.URL.revokeObjectURL(url);
  };

Le téléchargement en tant qu'application/octet-stream est encore plus simple que l'utilisation de FormData : définissez les en-têtes avec les détails du fichier et le type de contenu, puis ajoutez le fichier au corps de la requête et c'est tout !

Conclusion

Il peut être un peu déroutant de savoir comment afficher, télécharger et télécharger des fichiers entre plates-formes. Dans cet article, nous avons vu les plus courants.

J'espère vous avoir aidé ?

Suivez-moi sur @twitter

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Remplacer les caractères de chaîne en javascriptRemplacer les caractères de chaîne en javascriptMar 11, 2025 am 12:07 AM

Explication détaillée de la méthode de remplacement de la chaîne JavaScript et de la FAQ Cet article explorera deux façons de remplacer les caractères de chaîne dans JavaScript: le code JavaScript interne et le HTML interne pour les pages Web. Remplacer la chaîne dans le code JavaScript Le moyen le plus direct consiste à utiliser la méthode Remplace (): str = str.replace ("trouver", "remplacer"); Cette méthode remplace uniquement la première correspondance. Pour remplacer toutes les correspondances, utilisez une expression régulière et ajoutez le drapeau global G: str = str.replace (/ fi

Tutoriel de configuration de l'API de recherche Google personnaliséTutoriel de configuration de l'API de recherche Google personnaliséMar 04, 2025 am 01:06 AM

Ce tutoriel vous montre comment intégrer une API de recherche Google personnalisée dans votre blog ou site Web, offrant une expérience de recherche plus raffinée que les fonctions de recherche de thème WordPress standard. C'est étonnamment facile! Vous pourrez restreindre les recherches à Y

Créez vos propres applications Web AjaxCréez vos propres applications Web AjaxMar 09, 2025 am 12:11 AM

Vous voici donc, prêt à tout savoir sur cette chose appelée Ajax. Mais qu'est-ce que c'est exactement? Le terme Ajax fait référence à un regroupement lâche de technologies utilisées pour créer un contenu Web interactif dynamique. Le terme Ajax, inventé à l'origine par Jesse J

Exemple Couleurs Fichier JSONExemple Couleurs Fichier JSONMar 03, 2025 am 12:35 AM

Cette série d'articles a été réécrite à la mi-2017 avec des informations à jour et de nouveaux exemples. Dans cet exemple JSON, nous examinerons comment nous pouvons stocker des valeurs simples dans un fichier à l'aide du format JSON. En utilisant la notation de paire de valeurs clés, nous pouvons stocker n'importe quel type

10 Highlighters de syntaxe jQuery10 Highlighters de syntaxe jQueryMar 02, 2025 am 12:32 AM

Améliorez votre présentation de code: 10 surligneurs de syntaxe pour les développeurs Partager des extraits de code sur votre site Web ou votre blog est une pratique courante pour les développeurs. Le choix du bon surligneur de syntaxe peut améliorer considérablement la lisibilité et l'attrait visuel. T

8 Superbes plugins de mise en page JQuery Page8 Superbes plugins de mise en page JQuery PageMar 06, 2025 am 12:48 AM

Tirez parti de jQuery pour les dispositions de page Web sans effort: 8 plugins essentiels JQuery simplifie considérablement la mise en page de la page Web. Cet article met en évidence huit puissants plugins jQuery qui rationalisent le processus, particulièrement utile pour la création de sites Web manuels

10 tutoriels JavaScript & jQuery MVC10 tutoriels JavaScript & jQuery MVCMar 02, 2025 am 01:16 AM

Cet article présente une sélection organisée de plus de 10 didacticiels sur les cadres JavaScript et JQuery Model-View-Controller (MVC), parfait pour augmenter vos compétences en développement Web au cours de la nouvelle année. Ces tutoriels couvrent une gamme de sujets, de Foundatio

Qu'est-ce que & # x27; ceci & # x27; en javascript?Qu'est-ce que & # x27; ceci & # x27; en javascript?Mar 04, 2025 am 01:15 AM

Points de base Ceci dans JavaScript fait généralement référence à un objet qui "possède" la méthode, mais cela dépend de la façon dont la fonction est appelée. Lorsqu'il n'y a pas d'objet actuel, cela fait référence à l'objet global. Dans un navigateur Web, il est représenté par Window. Lorsque vous appelez une fonction, cela maintient l'objet global; mais lors de l'appel d'un constructeur d'objets ou de l'une de ses méthodes, cela fait référence à une instance de l'objet. Vous pouvez modifier le contexte de ceci en utilisant des méthodes telles que Call (), Appliquer () et Bind (). Ces méthodes appellent la fonction en utilisant la valeur et les paramètres donnés. JavaScript est un excellent langage de programmation. Il y a quelques années, cette phrase était

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

MantisBT

MantisBT

Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

SublimeText3 version anglaise

SublimeText3 version anglaise

Recommandé : version Win, prend en charge les invites de code !

Adaptateur de serveur SAP NetWeaver pour Eclipse

Adaptateur de serveur SAP NetWeaver pour Eclipse

Intégrez Eclipse au serveur d'applications SAP NetWeaver.

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel