You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt.js中实现用户图片上传并存储至public文件夹的方法

解决方案

1. 前端代码调整

第一步:在组件data中添加变量

先在组件的data选项里声明存储选中文件的变量:

data() {
  return {
    plateName: '',
    platePrice: '',
    plateSelect: '',
    selectedFile: null // 新增:存储选中的图片文件
  }
}

第二步:完善uploadImg方法

修改uploadImg方法,获取用户选中的图片并做格式校验:

uploadImg() {
  const fileInput = document.getElementById('formFile');
  const file = fileInput.files[0];
  if (!file) return;

  // 仅允许上传图片格式
  const allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
  if (!allowedTypes.includes(file.type)) {
    alert('请上传JPG/PNG/GIF格式的图片');
    fileInput.value = ''; // 清空无效选择
    return;
  }

  this.selectedFile = file;
}

第三步:修改addFood方法,用FormData提交数据

因为要上传文件,不能用普通JSON提交,改用FormData封装表单数据:

addFood() {
  if (!this.selectedFile) {
    alert('请先选择菜品图片');
    return;
  }

  const formData = new FormData();
  formData.append('plateName', this.plateName);
  formData.append('platePrice', this.platePrice);
  formData.append('course', this.plateSelect);
  formData.append('image', this.selectedFile);

  $fetch("/api/insert/", {
    method: "POST",
    body: formData
    // 无需手动设置Content-Type,浏览器会自动添加multipart/form-data及边界标识
  })
  .then(() => window.location.href = "/inserimento")
  .catch((e) => alert(e))
}

2. 后端(Nuxt API)调整

第一步:安装文件上传依赖

在项目根目录执行:

npm install multer

第二步:修改API路由文件(/server/api/insert/index.js)

编写处理文件上传和数据库插入的逻辑:

import multer from 'multer';
import path from 'path';
import fs from 'fs';
// 替换成你实际的数据库连接实例
import db from '@/utils/db';

// 确保public/images目录存在,用于存储上传的图片
const uploadDir = path.join(process.cwd(), 'public', 'images');
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir, { recursive: true });
}

// 配置multer存储规则:生成唯一文件名避免覆盖
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, uploadDir);
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    cb(null, `food-${uniqueSuffix}${ext}`);
  }
});

const upload = multer({ storage: storage });

export default defineEventHandler(async (event) => {
  // 处理单文件上传
  await new Promise((resolve, reject) => {
    upload.single('image')(event.node.req, event.node.res, (err) => {
      if (err) reject(err);
      else resolve();
    });
  });

  // 获取表单文本字段
  const { plateName, platePrice, course } = await readBody(event);
  // 生成图片的相对访问路径(前端可直接通过/public/images/xxx访问)
  const imgPath = `/images/${event.node.req.file.filename}`;

  // 修改SQL语句,新增图片路径字段
  const sql = `INSERT INTO menu (food_name, price, course, img_path) VALUES (?, ?, ?, ?)`;
  await db.query(sql, [plateName, platePrice, course, imgPath]);

  return { success: true };
});

3. 数据库表结构修改

给menu表新增img_path字段,用于存储图片的相对路径:

ALTER TABLE menu ADD COLUMN img_path VARCHAR(255) NOT NULL;

内容的提问来源于stack exchange,提问作者Shodan4004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:05:21