使用 element ui 上传文件图片的方法 和 后台要如何获取并保c存到对应文件夹中

  1. 在action 添加 要上传的路由地址

  2.使用data属性向路由提交 数据

  3.后台使用path malter第三方插件 存储图片 可以使用图片原有的名称

  4.使用formilder 第三方插件  

一、element ui 上传图片 

  1. 在action 添加 要上传的路由地址

  2.使用data属性上传files 数据

  3.这样就可以上传图片了。之后就是后台怎么获取文件和保存

<template>
  <el-upload
    class="upload-demo"
    :action="uploadUrl"
    :on-preview="handlePreview"
    :on-remove="handleRemove"
    :file-list="fileList"
    :headers="headerObj"
    list-type="picture"
    :data="file"
  >
    <el-button size="small" type="primary">点击上传</el-button>
  </el-upload>
</template>
<script>
export default {
  data() {
    return {
      headerObj: {
        file:'',
        Authorization: window.sessionStorage.getItem("token"),
      },
      //1.配置要上传文件的路由
      uploadUrl: "http://localhost:3000/upload",
      fileList: [],
    };
  },
  methods: {
    // 处理图片的操作
    handleRemove(file, fileList) {
      console.log(file, fileList);
     //2.data属性的值 要提交的post 路由的数据 file 图片数据
      this.file=file
    },
    // 处理图片的效果
    handlePreview(file) {
      console.log(file);
    },
  },
};
</script>

二、后台获取文件

方法1

1.后台使用path malter第三方插件 存储图片 可以使用图片原有的名称

1.安装 multer库
yarn add multer -d
npm i multer -d

2.配置方法 

1.创建一个multer.js文件夹

2.配置图片的保持路径以父级为开始

列入a为根目录 :a/ms/multer.js  存放图片的文件a/uploads 

路径就为 ./uploads

const multer  = require('multer')
const path = require("path");
const storage = multer.diskStorage({
    destination: function (req, file, cb) {
    // 上传的文件目录(文件上传以后放在哪里)
        cb(null, './uploads')   
    },
    filename: function (req, file, cb) {
        //上传的文件名字 (文件名+‘-’+时间戳+源文件的后缀名【例如:jpg/png......】)
        // 可以使用图片原来的名称,但是如果名称重复了,会被覆盖
        cb(null, file.fieldname + '-' + Date.now()+path.extname(file.originalname)) 
    }
})
const upload = multer({ storage: storage })

3.路由使用

0.导入multer.js文件

// 导入图片存储位置
const upload = require("./multer.js");

1.在post()内的路由添加以下代码

2.使用 req.file 获取传递过来的路径了 

3.res.send()响应会你要响应的数据

upload.single('file')

Router.post("/upload",upload.single('file'), (req, res) => {
    res.send({ success: req.file });
});

 图片就出来了

方法2  

使用formidable第三方插件  

1.安装 formidable 库

npm install formidable -d 

2.导入

 const formidable = require('formidable')

 const path = require('path')

3.配置

 app.post('/load',tou,(req,res,next)=>{
	  //创建一个form表单对象
	   const form = new formidable.IncomingForm()
	       form.encoding = 'utf-8'; //设置编码格式
	       form.options.keepExtensions = true //保留后缀名
	       // 设置文件上传文件夹/路径,__dirname是一个常量,为当前路径
	       var uploadDir = path.join(__dirname, "./public/load");
	       form.uploadDir = uploadDir;  //本地文件夹目录路径
	       console.log(form.uploadDir);
	     next()
		  form.parse(req,(err,fields,files) => {
			  console.log(files);
		  })
 })

注意next不写。文件目录结构

前端html代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<form class="form-container" id="form" enctype="multipart/form-data">
			<div class="form-group">
				<label>商品名称</label>
				<input type="text" name="p_name" class="form-control" placeholder="请输入商品名称">
			</div>
			<div class="form-group">
				<label>商品价格</label>
				<input type="text" name="price" class="form-control" placeholder="请输入商品价格">
			</div>
			<div class="form-group">
				<label>商品描述</label>

				<textarea name="p_describe" id="" cols="30" rows="10" class="p_describe form-control"></textarea>
			</div>

			<div class="form-group">
				<label>商品图片</label>
				<input type="file" name="img_src" class="form-contro " id="file_input">
				<img src="" alt="" id="result" style=" max-width: 500px; vertical-align: middle;">
			</div>

			<div class="form-group">
				<label>角色</label>
				<select name="c_id" class="form-control">
					<option selected value="0">手办</option>
					<option value="1">服装</option>
				</select>
			</div>

			<!-- 用户状态 -->
			<!-- <div class="form-group">
		                    <label>状态</label>
		                    <select name="status" class="form-control">
		                        <option selected value="1">正常</option>
		                        <option value="2">禁用</option>
		                    </select>
		                </div> -->

			<div class="buttons" id="ti">
				<input type="button" class="btn btn-primary submit" value="提交">
				<span style="margin-left: 10px;color:aquamarine" id="span2"></span>
			</div>
		</form>

	</body>
</html>
 <script> 
    window.addEventListener('load', function (params) {

       
      
        var result = document.getElementById("result");
        var input = document.getElementById("file_input");

        if (typeof FileReader === 'undefined') {
            result.innerHTML = "抱歉,你的浏览器不支持 FileReader";
            input.setAttribute('disabled', 'disabled');
        } else {
            input.addEventListener('change', readFile, false);
        }

        function readFile() {
            // 第一步:获取文件
            var file = this.files[0];
            if (!/image\/\w+/.test(file.type)) {
                alert("文件必须为图片!");
                return false;
            }
             // 使用FileReader读取文件
            var reader = new FileReader();
              // 第二步:读取文件
            reader.readAsDataURL(file);

            // 第三步:将读取完的结果赋给页面上的img标签
            reader.onload = function (e) {
                result.src =   this.result  
            }
        }


        var submit = document.querySelector('.submit')
        var form1 = document.querySelector('#form')

        
        submit.addEventListener('click', (e) => {

            var formData = new FormData(form1)//dom对象form1
            let xhr = new XMLHttpRequest()
            xhr.open("post", 'http://localhost:3333/load',)
            xhr.send(formData)
            xhr.onload = function () {
                console.log(1);
                //根据对象http状态进行判断
                if (xhr.status == 200) {
                    // console.log(xhr.responseText);
                    // location = "./goods.html"
                }
            }




        })

    })
    //   http://localhost:3333/aa.html
</script>

后端完整代码

const express = require('express')
const app = express()
app.use(express.static('public'))


// //注册body-parser
// const parser = require('body-parser')
// app.use(parser.urlencoded({ extended: false }))

function tou(req, res, next) {
    // 允许那些客户端可以访问(跨域请求),get为get请求,post为post请求,*为全都可以
    //允许跨域操作的具体域名
    res.header("Access-Control-Allow-Origin", "*")
    // 允许客户端使用那些请求方法  允许跨域的HTTP方法
    res.header('Access-Control-Allow-Methods', "GET,POST")
    // 允许客户端请求的同时携带cookie信息
    res.header('Access-Control-Allow-Credentials', "true")
    next()
}

const cors = require('cors')
app.use(cors())

 const formidable = require('formidable')
 const path = require('path')

 
 app.post('/load',tou,(req,res,next)=>{
	 console.log(1112);
	 //创建一个form表单对象
	   const form = new formidable.IncomingForm()
	       form.encoding = 'utf-8'; //设置编码格式
	       form.options.keepExtensions = true //保留后缀名
	       // 设置文件上传文件夹/路径,__dirname是一个常量,为当前路径
	       var uploadDir = path.join(__dirname, "./public/load");
	       form.uploadDir = uploadDir;  //本地文件夹目录路径
	       console.log(form.uploadDir);
	     next()
		  form.parse(req,(err,fields,files) => {
			  console.log(files);
		  })
 })

 
   



 
 
const port = 3333
app.listen(port, () => {
	console.log(port)
})

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值