Maison interface Web js tutoriel React & Expo - Comment télécharger et télécharger des fichiers

React & Expo - Comment télécharger et télécharger des fichiers

Dec 16, 2024 am 12:30 AM

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);
});
Copier après la connexion
Copier après la connexion
Copier après la connexion

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 };
});
Copier après la connexion
Copier après la connexion
Copier après la connexion

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);
});
Copier après la connexion
Copier après la connexion
Copier après la connexion

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 };
});
Copier après la connexion
Copier après la connexion
Copier après la connexion

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 };
});
Copier après la connexion
Copier après la connexion

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);
  };
Copier après la connexion
Copier après la connexion

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);
});
Copier après la connexion
Copier après la connexion
Copier après la connexion

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 };
});
Copier après la connexion
Copier après la connexion
Copier après la connexion

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 };
});
Copier après la connexion
Copier après la connexion

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);
  };
Copier après la connexion
Copier après la connexion

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 de ce site Web
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

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

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Système de fusion, expliqué
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1666
14
Tutoriel PHP
1273
29
Tutoriel C#
1253
24
Moteurs JavaScript: comparaison des implémentations Moteurs JavaScript: comparaison des implémentations Apr 13, 2025 am 12:05 AM

Différents moteurs JavaScript ont des effets différents lors de l'analyse et de l'exécution du code JavaScript, car les principes d'implémentation et les stratégies d'optimisation de chaque moteur diffèrent. 1. Analyse lexicale: convertir le code source en unité lexicale. 2. Analyse de la grammaire: générer un arbre de syntaxe abstrait. 3. Optimisation et compilation: générer du code machine via le compilateur JIT. 4. Exécuter: Exécutez le code machine. Le moteur V8 optimise grâce à une compilation instantanée et à une classe cachée, SpiderMonkey utilise un système d'inférence de type, résultant en différentes performances de performances sur le même code.

Python vs JavaScript: la courbe d'apprentissage et la facilité d'utilisation Python vs JavaScript: la courbe d'apprentissage et la facilité d'utilisation Apr 16, 2025 am 12:12 AM

Python convient plus aux débutants, avec une courbe d'apprentissage en douceur et une syntaxe concise; JavaScript convient au développement frontal, avec une courbe d'apprentissage abrupte et une syntaxe flexible. 1. La syntaxe Python est intuitive et adaptée à la science des données et au développement back-end. 2. JavaScript est flexible et largement utilisé dans la programmation frontale et côté serveur.

De C / C à JavaScript: comment tout cela fonctionne De C / C à JavaScript: comment tout cela fonctionne Apr 14, 2025 am 12:05 AM

Le passage de C / C à JavaScript nécessite de s'adapter à la frappe dynamique, à la collecte des ordures et à la programmation asynchrone. 1) C / C est un langage dactylographié statiquement qui nécessite une gestion manuelle de la mémoire, tandis que JavaScript est dynamiquement typé et que la collecte des déchets est automatiquement traitée. 2) C / C doit être compilé en code machine, tandis que JavaScript est une langue interprétée. 3) JavaScript introduit des concepts tels que les fermetures, les chaînes de prototypes et la promesse, ce qui améliore la flexibilité et les capacités de programmation asynchrones.

Javascript et le web: fonctionnalité de base et cas d'utilisation Javascript et le web: fonctionnalité de base et cas d'utilisation Apr 18, 2025 am 12:19 AM

Les principales utilisations de JavaScript dans le développement Web incluent l'interaction client, la vérification du formulaire et la communication asynchrone. 1) Mise à jour du contenu dynamique et interaction utilisateur via les opérations DOM; 2) La vérification du client est effectuée avant que l'utilisateur ne soumette les données pour améliorer l'expérience utilisateur; 3) La communication de rafraîchissement avec le serveur est réalisée via la technologie AJAX.

JavaScript en action: Exemples et projets du monde réel JavaScript en action: Exemples et projets du monde réel Apr 19, 2025 am 12:13 AM

L'application de JavaScript dans le monde réel comprend un développement frontal et back-end. 1) Afficher les applications frontales en créant une application de liste TODO, impliquant les opérations DOM et le traitement des événements. 2) Construisez RestulAPI via Node.js et Express pour démontrer les applications back-end.

Comprendre le moteur JavaScript: détails de l'implémentation Comprendre le moteur JavaScript: détails de l'implémentation Apr 17, 2025 am 12:05 AM

Comprendre le fonctionnement du moteur JavaScript en interne est important pour les développeurs car il aide à écrire du code plus efficace et à comprendre les goulots d'étranglement des performances et les stratégies d'optimisation. 1) Le flux de travail du moteur comprend trois étapes: analyse, compilation et exécution; 2) Pendant le processus d'exécution, le moteur effectuera une optimisation dynamique, comme le cache en ligne et les classes cachées; 3) Les meilleures pratiques comprennent l'évitement des variables globales, l'optimisation des boucles, l'utilisation de const et de locations et d'éviter une utilisation excessive des fermetures.

Python vs JavaScript: communauté, bibliothèques et ressources Python vs JavaScript: communauté, bibliothèques et ressources Apr 15, 2025 am 12:16 AM

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Python vs JavaScript: environnements et outils de développement Python vs JavaScript: environnements et outils de développement Apr 26, 2025 am 12:09 AM

Les choix de Python et JavaScript dans les environnements de développement sont importants. 1) L'environnement de développement de Python comprend Pycharm, Jupyternotebook et Anaconda, qui conviennent à la science des données et au prototypage rapide. 2) L'environnement de développement de JavaScript comprend Node.js, VScode et WebPack, qui conviennent au développement frontal et back-end. Le choix des bons outils en fonction des besoins du projet peut améliorer l'efficacité du développement et le taux de réussite du projet.

See all articles