简体   繁体   English

React base64 图片上传导致409错误

[英]React base64 image upload causes 409 Error

I am currently coding a app in React, where you can upload images with text, just like a social media app.我目前正在用 React 编写一个应用程序,您可以在其中上传带有文本的图像,就像一个社交媒体应用程序一样。 If I want to upload an image, I am getting a error: POST http://localhost:5000/posts 409 (Conflict) Without the Image, everything works fine.如果我想上传图片,我会收到错误消息: POST http://localhost:5000/posts 409 (Conflict)没有图片,一切正常。 I don't know where the mistake could be, so it would be nice if you can help me.我不知道错误可能出在哪里,所以如果你能帮助我,那就太好了。 This is my React Code:这是我的反应代码:

import { useState } from "react";
import FileBase64 from "react-file-base64";
export default function Create() {
  const [postData, setPostData] = useState({
    creator: "",
    title: "",
    content: "",
    tags: "",
    selectedFile: "",
  });

  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      await fetch("http://localhost:5000/posts", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(postData),
      });

      console.log("Post created");
    } catch (error) {
      console.log(error);
    }
  };

  return (
    <div className="form-container">
      <form onSubmit={handleSubmit}>
        <h2 className="form-title">Create a Memory</h2>
        {/* Creator */}
        <div className="form-group">
          <label htmlFor="creator">Creator</label>
          <input
            value={postData.creator}
            onChange={(e) =>
              setPostData({ ...postData, creator: e.target.value })
            }
            type="text"
            id="creator"
            placeholder="Creator"
          />
        </div>
        {/* Title */}
        <div className="form-group">
          <label htmlFor="title">Title</label>
          <input
            value={postData.title}
            onChange={(e) =>
              setPostData({ ...postData, title: e.target.value })
            }
            type="text"
            id="title"
            placeholder="Title"
          />
        </div>
        {/* Content */}
        <div className="form-group">
          <label htmlFor="content">Content</label>
          <input
            value={postData.content}
            onChange={(e) =>
              setPostData({ ...postData, content: e.target.value })
            }
            type="text"
            id="content"
            placeholder="Content"
          />
        </div>
        {/* Tags */}
        <div className="form-group">
          <label htmlFor="tags">Tags</label>
          <input
            value={postData.tags}
            onChange={(e) => setPostData({ ...postData, tags: e.target.value })}
            type="text"
            id="tags"
            placeholder="Tags"
          />
        </div>
        {/* selectedFile */}
        <label className="custom-file-upload">
          <FileBase64
            type="file"
            multiple={false}
            onDone={(base64) => {
              setPostData({ ...postData, selectedFile: base64 });
            }}
          />
        </label>
        {/* Submit */}
        <button
          style={{ width: "90%", fontSize: "inherit" }}
          className="btn-primary"
          type="submit"
        >
          Submit
        </button>
      </form>
    </div>
  );
}

MongoDB Post Model: MongoDB 后 Model:

import mongoose from "mongoose";

const postSchema = mongoose.Schema({
  title: String,
  content: String,
  creator: String,
  tags: [String],
  selectedFile: String,
  likeCount: {
    type: Number,
    default: 0,
  },
  createdAt: {
    type: Date,
    default: new Date(),
  },
});

const Post = mongoose.model("Post", postSchema);

export default Post;

Create Post function:创建帖子 function:

export const createPost = async (req, res) => {
  try {
    const post = new Post(req.body);
    await post.save();
    res.status(201).json(post);
  } catch (error) {
    res.status(409).json({ message: error.message });
  }
};

And server index.js和服务器 index.js

import express from "express";
import cors from "cors";
import mongoose from "mongoose";

const app = express();
const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json({ limit: "30mb" }));

import postRoutes from "./routes/posts.js";

app.use("/posts", postRoutes);

try {
  mongoose
    .connect(
      "<ConnectionString>",
      {
        useNewUrlParser: true,
        useUnifiedTopology: true,
      }
    )
    .then(() => {
      app.listen(port, () =>
        console.log(`Server started on port http://localhost:${port}`)
      );
    });
} catch (error) {
  console.log(error.message);
}

On your code at FileBase64, you should enclose base64 with {}在 FileBase64 的代码中,您应该用 {} 括起来 base64

<FileBase64
    type="file"
    multiple={false}
    onDone={({base64}) => {
    setPostData({ ...postData, selectedFile: base64 });
    }}
 />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM