node+express使用multer上传的图片怎么让前端显示?

做了一个前后端分离的文件上传 前端使用react+antd的upload组件实现上传功能,后端使用node+multer,图片上传成功了,也存到数据库里了但是前端无法显示
前端代码

<div className='avatar-relative'>
          <Upload
            name='avatar'
            onChange={handleAvatarChange}
            showUploadList={false}
            action='/api/users/update-avatar'
            className='upload-avatar'
            data={{
              id,
            }}
          >
            <EditOutlined className='edit-logo' />
          </Upload>
          <Avatar size={100} icon={<UserOutlined />} />
          <img src={`${user.avatar}`} alt='avatar' />
        </div>

后端代码

var express = require('express')
var router = express.Router()
const multer = require('multer')
const userController = require('../controllers/users')

const upload = multer({ dest: 'public/avatars/' })

router.post(
  '/update-avatar',
  upload.single('avatar'),
  userController.updateAvatar
)
updateAvatar: async (req, res) => {
    const { file } = req
    const avatarUrl = `/public/avatars/${file.filename}`
    const { id } = req.body
    try {
      const data = await userServices.updateAvatar(avatarUrl, id)
      if (data[0]) {
        res.send(sendData(true))
      }
    } catch (error) {
      res.status(500).send(sendData(false, error.message))
    }
  },

上传成功后在本地文件显示为这样
image.png
数据库里
image.png
显示在页面上
image.png
image.png

阅读 1.2k
avatarAI BotBETA

这个问题似乎是前端无法正确获取到上传并存储在服务器上的图片。

首先,你需要确保你的前端代码正确地发送了文件。你的前端代码中,action 属性设置为 '/api/users/update-avatar',这是一个POST请求,你需要确保你正确地在后端接收到了这个文件。你可以在你的后端代码中添加一些日志来确认这一点。

其次,你需要确认图片是否已经被正确地存储在服务器上。你可以检查 multer 的 dest 属性是否设置正确,以及文件是否被正确地保存到了这个路径。在你的代码中,multer 的 dest 属性被设置为 'public/avatars/',这意味着所有上传的文件都会被保存到这个路径。你需要确保这个路径是可写的,而且文件已经被正确地保存到了这个路径。

然后,你需要确认你的前端代码是否正确地获取了图片。在你的前端代码中,你试图通过访问一个变量 user.avatar 来获取图片的 URL。你需要确保这个变量是存在的,而且它包含了正确的图片 URL。你可以在你的前端代码中添加一些 console.log 来检查这个变量是否包含了正确的值。

最后,你可能需要更新你的数据库以包含图片的 URL。在你的后端代码中,你试图将图片的 URL 保存到数据库中。你可能需要更新你的数据库模型以包含这个字段,或者你可能需要将图片的 URL 保存到其他地方,比如一个云存储服务。

如果所有的这些步骤都正确地执行了,你的前端应该能够正确地显示上传的图片。

1 个回答

很明显上传成功,存储成功,但是你本地使用的时候,用的是相对路径,所以浏览器会去前端项目的路径里找图片,当然是找不到的。

解决方案就是使用后端的路径。或者通过某种方式进行映射也可以,看你准备怎么部署。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题