Как загружать файлы в React с помощью NodeJS и Express
2 года назад·3 мин. на чтение
В этой статье рассмотрим как загрузить файлы в React использованием Express в качестве бэкенда.
Создание бэкенда на Express
Во-первых, мы создаем POST API с использованием NodeJS и Express, который поможет нам загружать файлы (изображения, pdf и т. д.) на внутренний сервер.Настройка серверного проекта
Давайте настроим бэкенд проект NodeJS, выполнив следующие команды одну за другой.mkdir fileupload cd fileupload npm init -y
Установка пакетов
Теперь нам нужно установить четыре пакета:express
, express-fileupload
, cors
и nodemon
.
Выполните приведенную ниже команду, чтобы установить пакеты.
Теперь откройте папкуnpm i express express-fileupload cors nodemon
fileupload
в вашем любимом редакторе кода и создайте новый файл с именем server.js
.
Добавьте следующий код в файл server.js
.
В приведенном выше коде мы сначала импортировали три пакета:// server.js const express = require('express'); const fileUpload = require('express-fileupload'); const cors = require('cors') const app = express(); // middleware app.use(express.static('public')); // для доступа к файлам в папке public app.use(cors()); app.use(fileUpload()); // API для загрузки файлов app.post('/upload', (req, res) => { if (!req.files) { return res.status(500).send({ msg: "file is not found" }) } const myFile = req.files.file; // метод mv() помещает файл в папку public myFile.mv(`${__dirname}/public/${myFile.name}`, function (err) { if (err) { console.log(err) return res.status(500).send({ msg: "Error occurred" }); } // возвращаем ответ с именем файла и его расположением return res.send({name: myFile.name, path: `/${myFile.name}`}); }); }) app.listen(4500, () => { console.log('server is running at port 4500'); })
express
, express-fileupload
и cors
, а затем создали приложение express вызвав функцию express()
Наш маршрут POST API - /upload
.
Мы помещаем файлы в общую папку public
. Для этого нам нужно создать папку public
внутри нашего бэкенд-проекта.
Добавление скриптов
Чтобы запускать и перезапускать сервер мы используемnodemon
. Откройте файл package.json
и добавьте следующий код в scripts
.
Теперь запустите сервер, выполнив команду"server": "nodemon server.js"
npm run server
в терминале.
Создание приложения React
Давайте создадим новое React приложение, выполнив следующую команду.Теперь измените текущий рабочий каталог, выполнив приведенную ниже команду.npx create-react-app react-fileupload
cd react-fileupload
Установка библиотеки Axios
Нам также необходимо установить клиентскую библиотекуaxios
, которая используется для выполнения http-запросов.
npm i axios
Создание компонента загрузки файлов
Откройте папкуreact-fileupload
в своем любимом редакторе кода и создайте новый файл с именем fileupload.js
внутри папки src
.
Теперь добавьте следующий код.
В приведенном выше коде мы использовали хуки react для управления состоянием, и у нас есть две функции:// fileupload.js import React, { useRef, useState } from 'react'; import axios from 'axios'; function FileUpload() { // для хранения загруженного файла const [file, setFile] = useState(''); // для хранения ответа от бекенда const [data, getFile] = useState({ name: "", path: "" }); const [progress, setProgess] = useState(0); // progessbar const el = useRef(); // для доступа к инпуту const handleChange = (e) => { setProgess(0) const file = e.target.files[0]; // доступ к файлу console.log(file); setFile(file); // сохранение файла } const uploadFile = () => { const formData = new FormData(); formData.append('file', file); // добавление файла axios.post('http://localhost:4500/upload', formData, { onUploadProgress: (ProgressEvent) => { let progress = Math.round( ProgressEvent.loaded / ProgressEvent.total * 100 ) + '%'; setProgess(progress); } }).then(res => { console.log(res); getFile({ name: res.data.name, path: 'http://localhost:4500' + res.data.path }) }).catch(err => console.log(err)) } return ( <div> <div className="file-upload"> <input type="file" ref={el} onChange={handleChange} /> <div className="progessBar" style={{ width: progress }}> {progress} </div> <button onClick={uploadFile} className="upbutton"> Upload </button> <hr /> {/* для показа полученного изображения */} {data.path && <img src={data.path} alt={data.name} />} </div> </div> ); } export default FileUpload;
handleChange
и uploadFile
.
handleChange
вызывается после того, как пользователь выбрал файл.
Функция uploadFile()
используется для загрузки файла в наш /upload
api.
Существует также индикатор выполнения, который показывает прогресс загрузки файла на сервер, а также мы отображаем изображение после получения ответа от сервера.
Добавление стилей css
Добавьте следующие стили в файлApp.css
.
Теперь импортируйте компонент.App { margin: 2rem auto; max-width: 800px; } img { width: 500px; height: 500px; object-fit: contain; } .progessBar { height: 1rem; width: 0%; background-color: rgb(68, 212, 231); color: white; padding:2px } .file-upload { box-shadow: 2px 2px 2px 2px #ccc; padding: 2rem; display: flex; flex-direction: column; justify-content: space-between; font-size: 1rem; } input , div , button{ margin-top: 2rem; } .upbutton { width: 5rem; padding: .5rem; background-color: #2767e9; color: aliceblue; font-size: 1rem; cursor: pointer; }
FileUpload
в файл App.js
.
Запустите приложение React, запустив// App.js import React from 'react'; import FileUpload from './fileupload'; import './App.css'; function App() { return ( <div className="App"> <FileUpload /> </div > ); } export default App;
npm start
.Как подключить шрифт в React
2 года назад·3 мин. на чтение
Рассмотрим три быстрых способах подключения шрифтов в React приложение.
font
В HTML используется для указания начертания, размера шрифта, типографики текста. Вы можете добавить шрифты в свое React приложение разными способами.
Способ 1. С использованием link
Мы можем ссылаться на любые шрифты из Интернета, с помощью тега <link>
внутри HTML-файла. Рассмотрим пример применения Google Fonts шрифта с помощью тега <link>
.
- Переходим в fonts.google.com
- Кликаем на шрифт
- Кликаем на “Select Regular 400” (или на любые другие выбранные виды, можно несколько)
- Нажимаем на иконку “View selected families” сверху справа.
- В появившемся боковом меню переходим в секцию “Use on the web” и копируем код, расположенный под
<link>
- Переходим в
index.html
. Если ваше приложение создано с помощьюcreate-react-app
, тоindex.html
находится в папкеpublic
. Вставляем код, скопированный в п.5 внутрь<head>
.
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet">
- На сайте Google Fonts в том же боковом меню находим секцию “CSS rules to specify families” и копируем код.
- Переходим в CSS файл и добавляем следующий стиль, вставляем скопированный код:
.font-roboto { font-family: 'Roboto', sans-serif; /* скопированный код */ }
- Применяем этот стиль в любом React компоненте
// App.jsx import './App.css'; function App() { return ( <div className="font-roboto"> <p>Hello</p> </div> ); } export default App;
Способ 2. С использованием Web Font Loader
Web Font Loader помогает загружать шрифты из Google Fonts, Typekit, Fonts.com и Fontdeck, а также самостоятельно размещенные веб-шрифты. Он разработан совместно компаниями Google и Typekit. Давайте посмотрим, как загрузить несколько шрифтов из Google Fonts и использовать их в компоненте React.- Установим
webfontloader
илиyarn add webfontloader
npm i webfontloader
- Импортируем
webloader
в компонент
import WebFont from 'webfontloader';
- Загружаем нужные шрифты, используя имя шрифта. Лучше использовать хук
useEffect
и позволить ему выполняться один раз при загрузке компонента. Поскольку шрифты должны быть загружены только один раз в приложении, вы можете загрузить их в файлеindex.js
.
Здесь мы загружаем шрифты 'Droid Sans' и 'Chilanka'.useEffect(() => { WebFont.load({ google: { families: ['Droid Sans', 'Chilanka'] } }); }, []);
- Теперь вы можете использовать эти шрифты в компоненте React с помощью атрибута
className
илиstyle
. Чтобы использовать атрибутclassName
, создайте CSS-класс в файле.css
.
Затем, в методе.font-loader { font-family: 'Chilanka'; }
render()
компонента добавьте следующее.
Или, с атрибутом<div className="font-loader"> Hello, World! </div>
style
<div style={{fontFamily: 'Droid Sans'}}> Hello, World! </div>
Способ 3. С использованием @font-face
Иногда шрифты должны быть загружены локально и упакованы в приложение.
@font-face
- это правило CSS для определения имени шрифта путем указания на него с помощью URL.
-
Создадим папку
fonts
в каталогеsrc
. -
Загрузим необходимые шрифты. В этом примере мы загрузим шрифт
Lobster
. Для этого выберем шрифт в Google Fonts, нажмем “Download family” и распакуем архив.
- Скопируем содержимое в папку
src\fonts
.
- Затем импортируем шрифты в файл
index.js
.
import './fonts/Lobster/Lobster-Regular.ttf';
- В файл
index.css
добавим
@font-face { font-family: "LobsterRegular"; src: local("LobsterRegular"), url("./fonts/Lobster/Lobster-Regular.ttf") format("truetype"); font-weight: normal; }
- Теперь добавим имя класса в файл
App.css
, который использует этот шрифт.
.font-lobster { font-family: "LobsterRegular"; }
- Применяем этот стиль в любом React компоненте
// App.jsx import './App.css'; function App() { return ( <div className="font-lobster"> <p>Hello</p> </div> ); } export default App;