🖍️
Developer Note
  • Welcome
  • Git
    • Eslint & Prettier & Stylelint & Husky
  • Programming Language
    • JavaScript
      • Script Async vs Defer
      • Module
      • Const VS Let VS Var
      • Promise
      • Event Loop
      • Execution Context
      • Hoisting
      • Closure
      • Event Buddling and Capturing
      • Garbage Collection
      • This
      • Routing
      • Debounce and Throttle
      • Web Component
      • Iterator
      • Syntax
      • String
      • Array
      • Object
      • Proxy & Reflect
      • ProtoType
      • Class
      • Immutability
      • Typeof & Instanceof
      • Npm (Node package manager)
    • TypeScript
      • Utility Type
      • Type vs Interface
      • Any vs Unknown vs Never
      • Void and undefined
      • Strict Mode
      • Namespace
      • Enum
      • Module
      • Generic
    • Python
      • Local Development
      • Uv
      • Asyncio & Event loop
      • Context Manager
      • Iterator & Generator
      • Fast API
      • Pydantic & Data Class
    • Java
      • Compilation and Execution
      • Data Type
      • Enumeration
      • Data Structure
      • Try Catch
      • InputStream and OutputStream
      • Concurrent
      • Unicode Block
      • Build Tools
      • Servlet
      • Java 8
  • Coding Pattern
    • MVC vs MVVM
    • OOP vs Functional
    • Error Handling
    • MVC vs Flux
    • Imperative vs Declarative
    • Design Pattern
  • Web Communication
    • REST API
      • Web Hook
      • CORS issue
    • HTTPS
    • GraphQL
      • REST API vs GraphQL
      • Implementation (NodeJS + React)
    • Server-Sent Event
    • Web Socket
    • IP
    • Domain Name System (DNS)
  • Frontend
    • Progressive Web App (PWA)
    • Single Page & Multiple Page Application
    • Search Engine Optimiaztion (SEO)
    • Web bundling & Micro-frontend
      • Webpack
        • Using Webpack to build React Application
        • Using Webpack to build react library
      • Vite
      • Using rollup to build react library
      • Implementing micro frontend
    • Web Security
      • CSRF & Nonce
      • XSS
      • Click hijacking
    • Cypress
    • CSS
      • Core
        • Box Model
        • Inline vs Block
        • Flexbox & Grid
        • Pseudo Class
        • Position
      • Tailwind CSS
        • Shadcn
      • CSS In JS
        • Material UI
    • React
      • Core
        • Component Pattern
        • React Lazy & Suspense
        • React Portal
        • Error Boundary
        • Rendering Methods
        • Environment Variable
        • Conditional CSS
        • Memo
        • Forward Reference
        • High Order Component (HOC) & Custom Hook
        • TypeScript
      • State Management
        • Redux
        • Recoil
        • Zustand
      • Routing
        • React Router Dom
      • Data Fetching
        • Axios & Hook
        • React Query
        • Orval
      • Table
        • React Table
      • Form & Validation
        • React Hook Form
        • Zod
      • NextJS
        • Page Router
        • App Router
      • React Native
    • Angular
    • Svelte
      • Svelte Kit
  • Backend
    • Cache
      • Browser Cache
      • Web Browser Storage
      • Proxy
      • Redis
    • Rate limit
    • Monitoring
      • Logging
      • Distributed Tracing
    • Load Test
    • Encryption
    • Authentication
      • Password Protection
      • Cookie & Session
      • JSON Web Token
      • SSO
        • OAuth 2.0
        • OpenID Connect (OIDC)
        • SAML
    • Payment
      • Pre-built
      • Custom
    • File Handling
      • Upload & Download (Front-end)
      • Stream & Buffer
    • Microservice
      • API Gateway
      • Service Discovery
      • Load Balancer
      • Circuit Breaker
      • Message Broker
      • BulkHead & Zipkin
    • Elastic Search
    • Database
      • SQL
        • Group By vs Distinct
        • Index
        • N + 1 problem
        • Normalization
        • Foreign Key
        • Relationship
        • Union & Join
        • User Defined Type
      • NOSQL (MongoDB)
      • Transaction
      • Sharding
      • Lock (Concurrency Control)
    • NodeJS
      • NodeJS vs Java Spring
      • ExpressJS
      • NestJS
        • Swagger
        • Class Validator & Validation Pipe
        • Passport (Authentication)
      • Path Module
      • Database Connection
        • Integrating with MYSQL
        • Sequalize
        • Integrating with MongoDB
        • Prisma
        • MikroORM
        • Mongoose
      • Streaming
      • Worker Thread
      • Passport JS
      • JSON Web Token
      • Socket IO
      • Bull MQ
      • Pino (Logging)
      • Yeoman
    • Spring
      • Spring MVC
      • Spring REST
      • Spring Actuator
      • Aspect Oriented Programming (AOP)
      • Controller Advice
      • Filter
      • Interceptor
      • Concurrent
      • Spring Security
      • Spring Boot
      • Spring Cloud
        • Resilience 4j
      • Quartz vs Spring Batch
      • JPA and Hibernate
      • HATEOS
      • Swagger
      • Unit Test (Java Spring)
      • Unit Test (Spring boot)
  • DevOp
    • Docker
    • Kubernetes
      • Helm
    • Nginx
    • File System
    • Cloud
      • AWS
        • EC2 (Virtual Machine)
        • Network
        • IAM
          • Role-Service Binding
        • Database
        • Route 53
        • S3
        • Message Queue
        • Application Service
        • Serverless Framework
        • Data Analysis
        • Machine Learning
        • Monitoring
        • Security
      • Azure
        • Identity
        • Compute Resource
        • Networking
        • Storage
        • Monitoring
      • Google Cloud
        • IAM
          • Workload Identity Federation
        • Compute Engine
        • VPC Network
        • Storage
        • Kubernetes Engine
        • App Engine
        • Cloud function
        • Cloud Run
        • Infra as Code
        • Pub/Sub
    • Deployment Strategy
    • Jenkins
    • Examples
      • Deploy NextJS on GCP
      • Deploy Spring on Azure
      • Deploy React on Azure
  • Domain Knowledge
    • Web 3
      • Blockchain
      • Cryptocurrency
    • AI
      • Prompt
      • Chain & Agent
      • LangChain
      • Chunking
      • Search
      • Side Products
Powered by GitBook
On this page
  • Upload
  • Download
  • Streaming
  • References

Was this helpful?

  1. Backend
  2. File Handling

Upload & Download (Front-end)

Upload

  • In order to pass the binary data to the server, the content type- multipart/form-data must be required

  • The multipart/form-data content type is designed to allow for the transmission of binary data, such as files, over HTTP. With this content type, the data in the request body is divided into multiple parts, each identified by a unique boundary string. Each part contains a header and a body, where the body contains the binary data of the file.

const url = `${process.env.REACT_APP_IMAGE_SERVICE_URL}/api/images`;
      const formData = new FormData();
      formData.append("file", file);
      formData.append("type", "hi");
      const { data } = await axios.post(url, formData);
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="text" name="text" value="text default" />
    <input type="file" name="file1" />
    <input type="file" name="file2" />
    <button type="submit">Submit</button>
</form>

Download

  • For downloading file, there are 2 types of url, data url and server url for a tag href

  • Download attribute on a tag can be used to specify the name of file that to be downloaded

Data Url

  • Can be used for download file without uploading to server

  • The format is

    data:[<mediatype>][;base64],<data>

  • Media type: mime type, e.g: image/png

  • data: the encoded data in base64 format which is converted from file binary data

The text/plain data Hello, World!
data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==

base64-encoded version of the above
data:,Hello%2C%20World%21

// excel file
data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64, xxxx

Server Url

  • File url that uploaded to server

  • Streaming can be allowed when using server url to download file

  • If authentication is needed, the hash can be get from api firstly, and then combine with server url to obtain the file, e.g: https://backend.com/test.txt?code=xxxxxx

Blob (Binary large object)

  • Blob data is a file-like object of immutable, raw data; they can be read as text or binary data, or converted into stream

  • When the server api return binary file (e.g: file), the endpoint is actually a file url

  • Sometimes, we need to fetch data instead of using a tag with server url to download file directly, for example: need to pass token into header

  • We need to get the blob data from response, make good use of blob data to create another url to new a tag to download file

 const downloadLink = document.createElement('a');
 downloadLink.href = URL.createObjectURL(blob);
 console.log(downloadLink.href);
 // blob:https://localhost:3000/d84cc112-85a0-4e8e-8319-233403c9c69e
 downloadLink.download = "123.csv";
 document.body.appendChild(downloadLink);
 downloadLink.click();

Streaming

  • For the default api calling, the client will wait for the server until the whole of the server data is ready

  • After using streaming on front-end, the client can read the server response by chunks until the whole of data is get.

  • It can be used to trace the progress of getting data from backend


const reader = res.body.getReader();
// let sum = 0;
const stream = new ReadableStream({
	start(controller) {
	  return pump();
	  function pump() {
		return reader.read().then(({ done, value }) => {
		  // When no more data needs to be consumed, close the stream
		  if (done) {
			controller.close();
			return;
		  }
		  // Enqueue the next data chunk into our target stream
		  controller.enqueue(value);
		  // Can Conduct the logic based on the current chunk data (value)
		  // console.log("value",value);
		  // sum+=value.length;
		  // console.log("sum",sum);
		  return pump();
		});
	  }
	},
  });
const response = new Response(stream);
console.log(response);
return response.blob();

References

PreviousFile HandlingNextStream & Buffer

Last updated 1 year ago

Was this helpful?

LogoStreams API - Web APIs | MDNMDN Web Docs
LogoData URLs - HTTP | MDN