Express+React+Antd實(shí)現(xiàn)上傳功能(前端和后端)
前端部分:
1、新建React項(xiàng)目
終端輸入:
npx create-react-app myapp
執(zhí)行后初始化Reac項(xiàng)目就完成了。
2、安裝Antd
npm install antd --save
看到antd及版本號(hào)說明安裝成功。
3、使用Upload組件
import React, { useState } from 'react'; import { PlusOutlined } from '@ant-design/icons'; import { Image, Upload } from 'antd'; const getBase64 = (file) => new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result); reader.onerror = (error) => reject(error); }); const MyUpload = () => { const [previewOpen, setPreviewOpen] = useState(false); const [previewImage, setPreviewImage] = useState(''); const [fileList, setFileList] = useState([ { uid: '-1', name: 'image.png', status: 'done', url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', }, { uid: '-2', name: 'image.png', status: 'done', url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', }, { uid: '-3', name: 'image.png', status: 'done', url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', }, ]); const handlePreview = async (file) => { if (!file.url && !file.preview) { file.preview = await getBase64(file.originFileObj); } setPreviewImage(file.url || file.preview); setPreviewOpen(true); }; const handleChange = ({ fileList: newFileList }) => setFileList(newFileList); const uploadButton = ( <button style={{ border: 0, background: 'none', }} type="button" > <PlusOutlined /> <div style={{ marginTop: 8, }} > 上傳圖片 </div> </button> ); return ( <> <Upload action="" listType="picture-card" fileList={fileList} onPreview={handlePreview} onChange={handleChange} > {fileList.length >= 8 ? null : uploadButton} </Upload> {previewImage && ( <Image wrapperStyle={{ display: 'none', }} preview={{ visible: previewOpen, onVisibleChange: (visible) => setPreviewOpen(visible), afterOpenChange: (visible) => !visible && setPreviewImage(''), }} src={previewImage} /> )} </> ); }; export default MyUpload;
前端部分完成。
后端部分
1、初始化
創(chuàng)建文件夾,打開終端輸入:
npm init
可以看到自動(dòng)生成了package.json
接下來安裝express
npm install express --save
2、安裝express-generator
npx express-generator 或者 npm install express-generator
express-generator可以為我們自動(dòng)生成項(xiàng)目骨架。
骨架搭建完畢后再執(zhí)行npm install 安裝依賴,接著執(zhí)行npm start,項(xiàng)目成功運(yùn)行!
訪問localhost:3000,3000為默認(rèn)端口,看到如下頁(yè)面說明express項(xiàng)目搭建完成。
3、圖片上傳接口
在express中可以使用multer實(shí)現(xiàn)圖片上傳。
安裝multer
npm install multer
import express from 'express' import multer from 'multer' const app = express() // 設(shè)置存儲(chǔ)配置 const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now() + file.originalname) } }) const upload = multer({ storage: storage }); // 解析post請(qǐng)求body參數(shù) app.use(express.urlencoded({extended: false })) app.use(express.json()) // 托管靜態(tài)文件 app.use('/uploads', express.static('uploads')) // 設(shè)置跨域 app.all('*', function (req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Content-Type'); res.header('Access-Control-Allow-Methods', '*'); res.header('Content-Type', 'application/json;charset=utf-8'); next(); }); // 處理上傳的圖片 app.post('/upload', upload.single('image'), (req, res) => { const file = req.file; console.log(file); if (!file) { return res.status(400).send('No file uploaded.'); } res.json('File uploaded successfully.'); }); import routerLogin from './router/login.js' import routerList from './router/list.js'; app.use('/api', routerLogin) app.use('/api', routerList) const port = 4000 app.listen(port, () => { console.log(`端口運(yùn)行于http://127.0.0.1:${port}`); })
到此這篇關(guān)于Express+React+Antd實(shí)現(xiàn)上傳功能的文章就介紹到這了,更多相關(guān)Express React Antd上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React通過父組件傳遞類名給子組件的實(shí)現(xiàn)方法
React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫(kù)。這篇文章主要介紹了React通過父組件傳遞類名給子組件的方法,需要的朋友可以參考下2017-11-11從零開始搭建一個(gè)react項(xiàng)目開發(fā)
這篇文章主要介紹了從零開始搭建一個(gè)react項(xiàng)目開發(fā),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02詳解如何使用React和MUI創(chuàng)建多選Checkbox樹組件
這篇文章主要為大家詳細(xì)介紹了如何使用 React 和 MUI(Material-UI)庫(kù)來創(chuàng)建一個(gè)多選 Checkbox 樹組件,該組件可以用于展示樹形結(jié)構(gòu)的數(shù)據(jù),并允許用戶選擇多個(gè)節(jié)點(diǎn),感興趣的可以了解下2024-01-01React中useEffect與生命周期鉤子函數(shù)的對(duì)應(yīng)關(guān)系說明
這篇文章主要介紹了React中useEffect與生命周期鉤子函數(shù)的對(duì)應(yīng)關(guān)系說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09React Native實(shí)現(xiàn)地址挑選器功能
這篇文章主要為大家詳細(xì)介紹了React Native仿地址挑選器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10React?Native實(shí)現(xiàn)Toast輕提示和loading效果
這篇文章主要介紹了React Native實(shí)現(xiàn)Toast輕提示和loading效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09