Axios+send Form Data+upload Image File
In this tutorial, I will testify you way to build a Vue File Upload instance that uses Axios and Multipart File for making HTTP requests. Y'all volition also know how to add together Bootstrap progress bar, show response message and display list of files' information (with url).
More than Practice:
– Vue upload Image using Axios (with Preview)
– Vue Multiple Files Upload with Axios, FormData and Progress Bars
– Vue.js two Grime Application with Vue Router & Axios
– Vue.js JWT Authentication with Vuex and Vue Router
– Vue Pagination with Axios and API example
Using Vuetify: Vuetify File Upload instance
Overview
Nosotros're gonna create a Vue File upload awarding in that user can:
- see the upload process (pct)
- view all uploaded files
- link to the file when clicking on the file proper noun
Hither are APIs that we will use Axios to make HTTP requests:
Methods | Urls | Actions |
---|---|---|
POST | /upload | upload a File |
Go | /files | get List of Files (proper name & url) |
Become | /files/[filename] | download a File |
You can find how to implement the Rest APIs Server at ane of following posts:
– Node.js Express File Upload Balance API case
– Node.js Limited File Upload to MongoDB case
– Node.js Express File Upload to Google Cloud Storage case
– Spring Kick Multipart File upload (to static binder) example
Or: Spring Boot Multipart File upload (to database) example
Technology
- Vue two.half dozen
- Axios 0.19.2
- Bootstrap iv
Setup Vue File Upload Projection
Open cmd at the folder you want to save Projection folder, run command:
vue create vue-upload-files
Yous volition see some options, cull default (babel, eslint).
Then we add together Axios library with control: npm install axios
.
Construction the Projection
Afterward the process is done. We create new folders and files like this:
– UploadFilesService provides methods to save File and get Files using Axios.
– UploadFiles component contains upload course, progress bar, display of list files.
– App.vue is the container that we embed all Vue components.
– alphabetize.html for importing the Bootstrap.
– http-mutual.js initializes Axios with HTTP base Url and headers.
– We configure port for our App in vue.config.js
Add Bootstrap to the project
Open index.html and add following line into <head>
tag:
<!DOCTYPE html> <html lang="en"> <head> ... <link type="text/css" rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" /> </caput> ... </html>
Initialize Axios for Vue HTTP Client
Under src folder, nosotros create http-common.js file like this:
import axios from "axios"; export default axios.create({ baseURL: "http://localhost:8080", headers: { "Content-type": "application/json" } });
Think to change the baseURL
, it depends on REST APIs url that your Server configures.
Create Service for Upload Files
This service will use Axios to send HTTP requests.
There are 2 functions:
-
upload(file)
: Post grade data with a callback for tracking upload progress -
getFiles()
: GET listing of Files' information
services/UploadFilesService.js
import http from "../http-mutual"; class UploadFilesService { upload(file, onUploadProgress) { let formData = new FormData(); formData.suspend("file", file); return http.mail service("/upload", formData, { headers: { "Content-Type": "multipart/form-data" }, onUploadProgress }); } getFiles() { return http.get("/files"); } } export default new UploadFilesService();
– First we import Axios every bit http
from http-common.js.
– FormData
is a data structure that can be used to store cardinal-value pairs. We utilise it to build an object which corresponds to an HTML course with suspend()
method.
– We pass onUploadProgress
to exposes progress events. This progress upshot are expensive (change detection for each outcome), so y'all should only utilize when you lot want to monitor information technology.
– We call the mail service()
& go()
method of Axios
to ship an HTTP Postal service & Get asking to the File Upload server.
Create Component for Upload Files
Allow'south create a File Upload UI with Progress Bar, Card, Button and Message.
Offset we create a Vue component template and import UploadFilesService
:
components/UploadFiles.vue
<template> </template> <script> import UploadService from "../services/UploadFilesService"; export default { name: "upload-files", information() { return { }; }, methods: { } }; </script>
Then we ascertain the some variables inside data()
export default { name: "upload-files", data() { render { selectedFiles: undefined, currentFile: undefined, progress: 0, bulletin: "", fileInfos: [] }; }, };
Adjacent we define selectFile()
method which helps us to go the selected Files from ref="file"
element in HTML template later on.
export default { name: "upload-files", ... methods: { selectFile() { this.selectedFiles = this.$refs.file.files; } } };
We likewise define upload()
method for upload file:
consign default { name: "upload-files", ... methods: { ... upload() { this.progress = 0; this.currentFile = this.selectedFiles.item(0); UploadService.upload(this.currentFile, event => { this.progress = Math.round((100 * event.loaded) / event.total); }) .then(response => { this.message = response.data.message; return UploadService.getFiles(); }) .then(files => { this.fileInfos = files.information; }) .catch(() => { this.progress = 0; this.message = "Could not upload the file!"; this.currentFile = undefined; }); this.selectedFiles = undefined; } } };
Nosotros apply selectedFiles
for accessing electric current File as the commencement Item. And so we call UploadService.upload()
method on the currentFile
with a callback.
The progress will exist calculated basing on event.loaded
and event.total
.
If the transmission is done, nosotros call UploadService.getFiles()
to become the files' information and assign the result to fileInfos
variable.
Here, fileInfos
is an assortment of {proper name, url}
objects.
We likewise need to do this work in mounted()
method:
export default { name: "upload-files", ... mounted() { UploadService.getFiles().then(response => { this.fileInfos = response.data; }); } };
Now nosotros implement the HTML template of the Upload File UI. Add together the following content to <template>
:
<template> <div> <div v-if="currentFile" class="progress"> <div class="progress-bar progress-bar-info progress-bar-striped" role="progressbar" :aria-valuenow="progress" aria-valuemin="0" aria-valuemax="100" :manner="{ width: progress + '%' }" > {{ progress }}% </div> </div> <characterization class="btn btn-default"> <input type="file" ref="file" @change="selectFile" /> </label> <button class="btn btn-success" :disabled="!selectedFiles" @click="upload"> Upload </push> <div class="alert alert-light" role="alert">{{ message }}</div> <div class="menu"> <div class="card-header">List of Files</div> <ul class="listing-group list-grouping-affluent"> <li grade="list-group-particular" v-for="(file, index) in fileInfos" :key="alphabetize" > <a :href="file.url">{{ file.name }}</a> </li> </ul> </div> </div> </template>
In the code in a higher place, we apply Bootstrap Progress Bar:
-
.progress
as a wrapper - inner
.progress-bar
to bespeak the progress -
.progress-bar
requiresmanner
to set the width by per centum -
.progress-bar
likewise requiresrole
and some aria attributes to make information technology attainable - Labels to progress bar is the text inside it
Add together Upload File Component to App Component
Open App.vue and embed the UploadFiles
Component with <upload-files>
tag.
<template> <div id="app"> <div class="container" fashion="width:600px"> <div fashion="margin: 20px"> <h3>bezkoder.com</h3> <h4>Vue.js upload Files</h4> </div> <upload-files></upload-files> </div> </div> </template> <script> import UploadFiles from "./components/UploadFiles"; export default { name: "App", components: { UploadFiles } }; </script>
Configure Port for Vue File Upload App
Because most of HTTP Server use CORS configuration that accepts resource sharing restricted to some sites or ports. And if you lot use the Project in this post for making Server, you need to configure port for our App.
In src
binder, create vue.config.js file with post-obit content:
module.exports = { devServer: { port: 8081 } }
We've set our app running at port 8081
. vue.config.js will exist automatically loaded by @vue/cli-service
.
Run the App
Run this Vue File Upload App with command: npm run serve
.
Open Browser with url http://localhost:8081/
and cheque the result.
Further Reading
- https://github.com/axios/axios
- Vue.js 2 Crud Application with Vue Router & Axios
Fullstack Crud App:
- Vue.js + Node.js + Limited + MySQL
- Vue.js + Node.js + Express + PostgreSQL
- Vue.js + Node.js + Express + MongoDB
- Vue.js + Spring Kicking + Embedded Database (H2)
- Vue.js + Spring Boot + MySQL
- Vue.js + Leap Kick + PostgreSQL
- Vue.js + Jump Boot + MongoDB
- Vue.js + Django Rest Framework
Conclusion
Today we're learned how to build an example for upload Files using Vue and Axios. We also provide the ability to prove listing of files, upload progress with Bootstrap, and to download file from the server.
You can find how to implement the Residue APIs Server at one of following posts:
– Node.js Express File Upload Residual API example
– Node.js Express File Upload to MongoDB example
– Node.js Limited File Upload to Google Cloud Storage example
– Leap Boot Multipart File upload (to static folder) example
Or: Spring Boot Multipart File upload (to database) example
If you want to upload multiple files similar this:
Delight visit:
Vue Multiple Files Upload with Axios, FormData and Progress Confined
Or utilise Vuetify for File Upload with the tutorial:
Vuetify File Upload case
Or Image upload:
Vue upload epitome using Axios (with Preview)
Source code
The source code for this Vue Client is uploaded to Github.
Source: https://www.bezkoder.com/vue-axios-file-upload/
0 Response to "Axios+send Form Data+upload Image File"
Post a Comment