用nodeExpress做后台的Vue模块化开发中elementUI图片上传的问题

 最近在Vue模块化开发中用到了elementUI中图片上传的功能,可是把我折腾的够呛,花了两天时间各种查API请教大佬最后解决了问题,希望我的问题可以在某个时候帮助各位。最后多嘴一句 elementUI的API该更新了!

element官网:http://element-cn.eleme.io/#/zh-CN

首先我前台上传的代码是这样的:

<el-upload
              class="upload-demo"
              id="lk-upload"
              action="http://localhost:8888/upload"
              :on-preview="handlePreview"
              :beforeUpload="beforeAvatarUpload"
              :on-progress="onProgress"
              :on-success="onSuccess1"
              :file-list="fileList2"
              :limit="1"
              :on-exceed="aaa"
              list-type="picture">
              <el-button size="small" type="primary">点击上传</el-button>
              <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过10M</div>
            </el-upload>

重点是action,它是上传的目标地址,必选参数,类型string。这是重点,这里配置的是我后台的端口和接口信息(前后台的端口是不一样的,所以后台需要配置跨域)。Vue部分就只有这些了。下面是后台部分。

这里给个链接,这位大佬配置的跨域很棒,参考一下就ok:https://www.cnblogs.com/xuange306/p/6185453.html

其次需要一个npm一个文件上传的模块:

       npm  i  multer  -D

然后在项目里建一个utils文件夹,在里面建一个multer.js文件,这个是用来解析前台图片,然后保存:

var multer = require('multer');

var storage = multer.diskStorage({
  destination: function (req, file, cb) { //指定硬盘的路径,文件保存的地方
    cb(null, './public/upload')
  },
  filename: function (req, file, cb) {//指定文件名和拓展名
    //originalname 文件名
    var arr = file.originalname.split('.');
    // cb(null, arr[0] + '.' + arr[1]);
    cb(null, arr[0] + '-' + Date.now() + '.' + arr[1]);
  }
});

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

module.exports = upload;

然后在app.js导入这个模块:

var multer=require('./utils/multer.js');

然后app.js配置接口,用multer处理前台的请求:

app.post('/upload',multer.array('file',5),function (req,res) {
  console.log('成功');
  res.send({error:0,res:req.files});
});

重点到了!我一直是卡在这一步。问题就在multer.array(‘前台发过来的名称’,最大处理个数)。这个名称我一般用的是files,因为一般都是多个上传,但是!element用的是file。API没有说明,我也一直错误的理解,目前为止我还不确定是否还有别的名称。然而我在console.log(req.file)的时候,控制台说没有file这个东西?这个时候又变成了files。天,你在玩什么?能给个明确的文档嘛。

对。其实很简单的嘛,你给个文档啊。各位有不明白的地方可以给我留言。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Vue是一种流行的JavaScript框架,用于构建交互式Web应用程序。Node是一个基于JavaScript的运行时环境,用于在服务器端运行JavaScript代码。ElementUI是一个基于VueUI组件库,提供了丰富的UI组件和交互效果。 要实现上传图片功能,可以使用VueElementUI提供的组件和方法。首先需要在Vue引入ElementUI组件库,然后使用el-upload组件来实现文件上传功能。在Node,可以使用multer间件来处理文件上传请求,将上传的文件保存到服务器上的指定目录。 具体实现步骤如下: 1. 在Vue引入ElementUI组件库 ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 2. 在Vue模板使用el-upload组件 ```html <el-upload class="upload-demo" action="/upload" :on-success="handleSuccess" :before-upload="beforeUpload" :file-list="fileList" :auto-upload="false"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> ``` 3. 在Vue组件定义上传文件的相关方法 ```javascript export default { data() { return { fileList: [] } }, methods: { handleSuccess(response, file, fileList) { console.log(response) }, beforeUpload(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' const isLt500K = file.size / 1024 < 500 if (!isJPG) { this.$message.error('上传头像图片只能是 JPG/PNG 格式!') } if (!isLt500K) { this.$message.error('上传头像图片大小不能超过 500KB!') } return isJPG && isLt500K }, submitUpload() { this.$refs.upload.submit() } } } ``` 4. 在Node使用multer间件处理文件上传请求 ```javascript const express = require('express') const multer = require('multer') const app = express() const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now()) } }) const upload = multer({ storage: storage }) app.post('/upload', upload.single('file'), function (req, res, next) { const file = req.file if (!file) { const error = new Error('Please upload a file') error.httpStatusCode = 400 return next(error) } res.send(file) }) ``` 以上就是使用VueNodeElementUI实现上传图片功能的基本步骤。需要注意的是,上传文件时需要设置文件类型和大小的限制,以及在Node设置文件上传的存储路径和文件名。 ### 回答2: Vue是一个流行的开源JavaScript框架,可用于构建灵活的用户界面。Node.js则是一种基于Chrome V8 JavaScript引擎构建的轻量级JavaScript运行时。ElementUI则是一套基于Vue.js 2.0的UI框架,其包括诸如按钮,表格,上传等组件。在本文,我们将探讨如何使用VueNode.js与ElementUI上传图片。 首先,我们需要使用ElementUI一个名为“el-upload”的组件。这个组件可以轻松实现文件上传。在Vue组件加入如下代码: ``` <template> <el-upload class="upload-demo" action="//dev-server/file/upload" :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeUpload"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> ``` 在上面的代码,我们可以看到action属性指向一个上传URL。在这个URL,我们需要使用Node.js编写一个接口来处理上传的文件。在我们的Node.js服务器上,这个接口看起来像这样: ``` const express = require('express') const multer = require('multer') const path = require('path') const app = express() const upload = multer({ dest: path.join(__dirname, '/uploads/') }) app.post('/file/upload', upload.single('avatar'), function(req, res) { // req.file是上传的文件 console.log(req.file) }) app.listen(3000, function() { console.log('listening on port 3000') }) ``` 在上面的Node.js代码,我们首先引入了express和multer模块。Multer模块是一个Node.js间件,用于处理multipart/form-data类型的数据(即文件上传)。 接下来,我们定义了一个上传路径,这个路径是使用multer的destination选项来指定的。然后,我们使用multer的single函数来处理单个文件的上传请求。 最后,我们在端口3000上启动服务器,监听上传请求。当上传文件时,我们将在控制台打印出上传文件的信息。这个接口的功能很简单,在实际的环境需要更加完善。 最后是实现上传文件只能是图片的方式,我们还要在ElementUI组件的beforeUpload方法判断、处理: ``` beforeUpload(file) { const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' if (!isJpgOrPng) { this.$message.error('上传头像图片只能是 JPG/PNG 格式!') return false } const isLt2M = file.size / 1024 / 1024 < 2 if (!isLt2M) { this.$message.error('上传头像图片大小不能超过 2MB!') return false } } ``` 在这个方法,我们检查要上传的文件是否是JPG或PNG格式,如果不是就返回一个错误提示信息。另外,我们也了一个文件大小的限制,上传的文件不能超过2MB。 综上所述,VueNode.js和ElementUI组合使用是上传图片的最佳方式。如果您需要一个简单,易于维护和扩展的上传图片的方案,这种组合是很适合的。 ### 回答3: Vue是一款流行的前端JavaScript框架,Node.js是一款流行的后端JavaScript框架,ElementUI是一款流行的Vue UI库,可以用来构建漂亮的Web界面。要在Vue Node ElementUI实现上传图片,需要以下步骤: 1.引入ElementUI组件和axios库 首先,在Vue组件引入ElementUI的Upload组件和axios库,用于发送HTTP请求。可以在组件的script标签通过import引入: import { Upload } from 'element-ui' import axios from 'axios' 2.使用Upload组件 然后,在Vue组件的template标签使用Upload组件,设置props属性和事件监听器。上传图片后,可以通过事件监听器的回调函数获取上传的文件信息,并将该信息发送到后端服务器。以下是一个基本的Upload组件示例: <el-upload class="upload-demo" action="/upload" :show-file-list="false" :on-success="handleSuccess"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> 其,action指定了上传文件的目的地,show-file-list设置为false表示不显示已经上传的文件,on-success是上传成功后的回调函数。 3.实现handleSuccess函数 最后,实现handleSuccess函数,将上传成功后的文件信息发送到后端服务器。可以使用axios库的post方法,将文件信息以FormData的形式发送到服务器: handleSuccess(response, file, fileList) { let formData = new FormData() formData.append('file', file) axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) .then(response => { console.log(response) }) .catch(error => { console.log(error) }) } 这里将上传的文件信息放到FormData对象,并设置Content-Type头部信息为multipart/form-data,以确保正确处理文件上传。 以上就是在Vue Node ElementUI实现上传图片的基本步骤。根据具体场景的需求,可能还需要进行一些额外的设置或修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值