express+react实现上传文件

一、使用express+mongodb搭建后端服务

  • 1、安装依赖包

    npm install express
    # 处理跨域的中间件
    npm install cors 
    npm install mongoose
    # 上传文件的
    npm install multer
    
  • 2、expressapp.js文件

    const express = require("express");
    const path = require("path");
    const bodyParser = require("body-parser");
    const cors = require('cors');
    const { Task } = require("./models");
    
    const mongoose = require("mongoose");
    const { static } = require("express");
    const multer = require('multer');
    // connect
    // mongodb://username:password@host:port/database
    //mongoose.connect("mongodb://sunqifa@deakin.edu.au:sqf0617.@localhost:27017/db", {
    mongoose.connect("mongodb://localhost:27017/db", {
      useCreateIndex: true,
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    
    const app = express();
    // 配置可以提交json数据
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(static("public"));
    app.use(cors()); // 跨域中间件
    
    //指定上传文件的存储空间
    const storage = multer.diskStorage({
      //指定上传的目录
      destination: path.join(__dirname, 'public', 'uploads'),
      filename (req, file, callback) {
        // callback 第二个参数是文件名 时间戳.jpg
        callback(null, Date.now() + path.extname(file.originalname));
      }
    });
    // 在需要上传的地方使用这个
    const upload = multer({ storage });
    
    // 定义一个借口,可以上传一个avatar图片字段和title的字段
    app.post("/api/task", upload.single('avatar'), async (req, res) => {
      const { body: reqBody } = req;
      const { title } = reqBody;
      let avatar = `${req.protocol}://${req.headers.host}/uploads/${req.file.filename}`;
      try {
        const task = await Task.create({title,avatar});
        res.send(task);
      } catch (error) {
        const err = error.errors;
        if (err) {
          let messages = [];
          for (let key in err) {
            messages.push(err[key].message);
          }
          return res.status(500).send({ messages: messages.join("-------") });
        }
      }
    });
    app.listen(3001, () => {
      console.log("http://localhost:3001");
    });
    
    

二、前端react结合axios上传文件

  • 1、前端代码

    import React, { useState, useRef } from 'react';
    import './index.css';
    import axios from 'axios';
    
    function CreateTask () {
      const [title, setTitle] = useState('');
      const file = useRef(null);
    
      const saveData = () => {
        // 使用formData上传
        let formData = new FormData()
        const currentFile = file.current.files[0];
        formData.append('avatar', currentFile, currentFile.name);
        // let config = {
        //   headers: { 'Content-Type': 'multipart/form-data' }
        // };
        formData.append('title', title);
        axios.post('http://localhost:3001/api/task', formData).then(response => {
          console.log(response);
          if (response.status === 200) {
            alert('add data success');
            window.location.href = '/'
          }
        })
      }
      return (
        <div className="App">
          <div className="f1">
            <span className="input-title">Title</span>
            <input type="text" placeholder="Enter task title" value={title} onChange={(event) => { setTitle(event.target.value) }} />
          </div>
          
          <div className="f1">
            <span className="input-title">task type</span>
            <input type="file" name="avatar" ref={file} />
          </div>
          <div className="save">
            <button className="save-btn" onClick={saveData}>Save</button>
          </div>
        </div>
      );
    }
    
    export default CreateTask;
    
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水痕01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值