vue实现文件上传,前后端

这篇具有很好参考价值的文章主要介绍了vue实现文件上传,前后端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前端封装el-upload组件,父组件传值dialogVisible(用于显示el-dialog),子组件接收,并且关闭的时候返回一个值(用于隐藏el-dialog),最多上传五个文件,文件格式为.jpg\pdf\png

<template>
    <div>
       <el-dialog  width="30%"  :visible.sync="dialogShow" append-to-body @close='handleCancle' title="上传发票" class="uploadDialog">
        <!-- 
            list-type="picture"
           :file-list="fileList"
            :on-change="changeFileLength"
            :on-success="handleAvatarSuccess"
            multiple
        -->
        <el-upload
           ref="upload"
           :auto-upload="false"
           :on-remove="handleRemove"
           :on-change="changeFileLength"
           :limit="5"
           :on-exceed="handleExceed"
           action="https://jsonplaceholder.typicode.com/posts/"
           list-type="picture"
           :file-list="fileList"
           accept=".pdf,.jpg,.png" 
           multiple
           >
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">选择文件</div>
            <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png/pdf文件,且不超过500kb</div> -->
        </el-upload>
        <el-button @click="upload" type="success">上传文件</el-button>
      </el-dialog> 
    </div>
</template>
<script>
import {  upload1 } from "@/api/invoice/invoiceManagement";
import pdfde from "./pdfdefine.png";

export default {
    name: "uploadCT",
    props:{
        dialogVisible:{
            type:Boolean,
            default:false,
            require:true,
        }
    },
    watch: {
        dialogVisible: {
            handler(val) {
                this.dialogShow = val
            },
            deep: true, // 深度监听
            immediate: true, // 初次监听即执行  
        },
    },

    data(){
        return{
            // 上传文件的列表
            uploadFiles: [],
            // 上传文件的个数
            filesLength: 0,
            // 上传需要附带的信息
            info:{
                id:"",
                name:"",
            },
            //显示
            dialogShow:this.dialogVisible,
            //缩略图
            fileList:[],
            def : pdfde,
        }
    },

    methods:{
        //删除
        handleRemove(file, fileList){
            console.log("移除");
            this.fileList=this.fileList.filter(item=>item.name!=file.name);
            this.uploadFiles =this.uploadFiles.filter(item=>item.name!=file.name);
            this.filesLength=fileList.length;
        },
        //超出限制提示
        handleExceed(files, fileList) {
            this.$message.warning(`当前限制选择 5 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
        },
        //关闭
        handleCancle(){
            this.uploadFiles= [];
            // 上传文件的个数
            this.filesLength= 0;
            this.dialogShow = false;
            this.$emit('closeUploadDialog',this.dialogShow);
            this.$refs.upload.clearFiles();
            this.fileList=[];
        },
        // 选择文件触发事件
        changeFileLength(file, fileList){
            console.log("选择",file,fileList);
            this.filesLength = fileList.length;
            if(file.name.endsWith('.pdf')){
                this.fileList.push({
                    name:file.name,
                    url: this.def,
                })
            }else{
                this.fileList.push({
                    name:file.name,
                    url:file.url,
                })
            }
            this.uploadFiles=fileList;
        },

        // 用户点击上传调用
        async upload(){
            // 触发上传 调用配置 :http-request="uploadFile"
            // 即触发 uploadFile函数
            console.log('点击',this.filesLength);
            if(this.filesLength>0){
                this.fileList[0].staus='ready';
                // await this.$refs.upload.submit();
                await this.uploadFilesToService();
                // 上传完成后执行的操作 ...
                
            }else{
                this.$modal.msgError( "请先选择文件");
            }
        },
        //上传按钮
        async uploadFilesToService(){
            console.log("上传",this.uploadFiles.length,this.filesLength);
            let that = this;
            if (this.uploadFiles.length == this.filesLength){
                // 创建FormData上传
                let fd = new FormData()
                // 将全部文件添加至FormData中qingxian
                this.uploadFiles.forEach(file => {
                    fd.append('file', file.raw)
                })
                // 将附加信息添加至FormData
                fd.append("id", this.info.id)
                fd.append("name", this.info.name)
                // 配置请求头
                const config = {
                    headers: {
                        "Content-Type": "multipart/form-data",
                    }
                }
                console.log("参数",fd);
                // 上传文件
                await upload1(fd).then(res => {
                    /*上传成功处理*/
                    console.log(res);
                    if(res.msg=='上传成功'){
                        this.uploadFiles=[];
                        this.filesLength = 0;
                        this.dialogShow = false;
                        this.$emit('closeUploadDialog',this.dialogShow);
                        this.$refs.upload.clearFiles();
                        this.uploadFiles = [];
                        this.filesLength = 0;
                        this.fileList = [];
                        this.$refs.upload.clearFiles();
                        this.$modal.msgSuccess("上传成功");
                    }else{
                        console.log("失败");
                        const arr1 =res.data.data;
                        this.$nextTick(()=>{
                            arr1.map(item1=>{
                                this.uploadFiles = this.uploadFiles.filter(item2=>item2.name!=item1);
                                this.fileList = this.fileList.filter(item=>item.name!=item1);
                            })
                        })
                        
                        this.filesLength=this.filesLength-arr1.length;
                        console.log(this.uploadFiles,this.filesLength);
                        this.$modal.msgError(res.data.msg);
                    }
                    
                }).catch(err => {/*报错处理*/console.log("报错",err);});

            }
        }
    }
}
</script>


    
    

后端接收

@PostMapping("/upload")
    public AjaxResult upload(@RequestParam(value = "file") MultipartFile[] file)
    {
        ArrayList<String> successList = new ArrayList<>();
        try {
            String localPath = "";
            //1.1获取当前日期,当做本地磁盘的目录
            Date nowDate = DateUtils.getNowDate();
            String format = new SimpleDateFormat("YYYYMMDD").format(nowDate);
            String localPathPrefix = "C:\\"+format;
            for(MultipartFile f:file){
                // 获取文件名
                String fileName = f.getOriginalFilename();
                // 获取文件后缀
                String prefix = fileName.substring(fileName.lastIndexOf("."));
                // 保存文件到本地磁盘
                localPath = localPathPrefix+"\\"+fileName;
                File localFile = new File(localPath);
                if (!localFile.getParentFile().exists()) {
                    localFile.getParentFile().mkdirs();
                }
                //写入到本地磁盘
                f.transferTo(localFile);
                // 获取文件在本地磁盘上的路径
                String filePath = localFile.getAbsolutePath();
                log.info("文件名称:"+fileName+"已经存入本地磁盘,全路径为:"+filePath);
                //成功一个,将文件名放入一个successList
                int i = finInvoiceDefineService.OCRToService(filePath);
                //删除本地临时磁盘文件
                if (localFile.delete()) {
                    log.info(localFile.getName() + "已经删除");
                } else {
                    log.info("文件删除失败");
                }
            }
            //删除本次磁盘的日期目录
            File file1 = new File(localPathPrefix);
            if (file1.delete()) {
                log.info(file1.getName() + "已经删除");
            } else {
                log.info("文件删除失败");
            }

        }catch (Exception e){
            log.error(e.toString());
            HashMap<String, Object> stringObjectHashMap = new HashMap<>();
            stringObjectHashMap.put("msg","OCR识别失败");
            stringObjectHashMap.put("data",successList);
            return success(stringObjectHashMap);
        }
        return success("上传成功");
    }

效果展示

vue实现文件上传,前后端,vue.js,javascript,前端

 文章来源地址https://www.toymoban.com/news/detail-661026.html

到了这里,关于vue实现文件上传,前后端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue前端实现上传文件的两种方式

    1.使用form表单的形式 第一种方式就是使用FormData的方式进行上传 html代码: JS代码: 2.使用element-ui的el-upload的方式进行上传 这里我是根据需求封装了一个组件

    2024年02月11日
    浏览(44)
  • 应用开发平台前端集成vue-simple-uploader实现文件分块上传

    文件的上传是系统的必备功能,Element提供了上传组件upload,也基本能满足常见常用的文件上传功能,特别是应对小型文件(10M以下)的处理。但如果是遇到要求更多更高的场景,上传几百兆甚至上G的视频文件,要求分块上传,能断点续传,显示进度,能暂停,能重试……这

    2024年02月08日
    浏览(56)
  • .net6Api后台+VUE3前端实现上传和下载文件全过程

    首先本文参考的是,感谢博主: net6WebApi上传下载文件_cduoa的博客-CSDN博客_webapi下载文件 在博主的基础上,增加了新的功能,代码中有注明,并且使用VUE3前端实现。 后端部分: 1.首先建立IFileService文件 2.建立FileService文件 3.增加FileController文件 4.Program文件中,进行配置和跨域

    2023年04月09日
    浏览(56)
  • vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法

    由于vue为单页面项目,通过控制组件局部渲染,main.js是整个项目唯一的入口,整个项目都在一个index.html外壳中。 若项目过大,会造成单页面负载过重;同时,多页面利于模块独立部署。 如果项目中不同的页面需要不同的main.js和App.vue这样就需要配置多个入口了。 要单独将页

    2024年01月22日
    浏览(90)
  • 前后端分离架构文件上传与下载(含Vue + Spring完整代码)

    本文采用前后端分离式的架构,其中涉及到文件下载的需求,文件下载在任何系统中都是比较常见的。对于前后端分离架构的文件下载与往常的写法有些许不同(试过直接使用a标签,href填上下载地址,发现行不通),所以经过查找与尝试,以下文件下载前后端实现流程供大家参

    2024年02月15日
    浏览(38)
  • minio&前后端分离上传视频/上传大文件——前后端分离断点续传&minio分片上传实现

    🍀🍀🍀🍀分布式文件系统-minio: 第一章:分布式文件系统介绍与minio介绍与使用(附minio java client 使用) 第二章:minio前后端分离上传视频/上传大文件——前后端分离断点续传minio分片上传实现 断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包

    2024年02月03日
    浏览(55)
  • 【JS】前端分片上传大文件(支持1G以上的超大文件)

           如果将大文件一次性上传, 耗时会非常长,甚至可能传输失败 ,那么我们怎么解决这个问题呢?既然大文件上传不适合一次性上传,那么我们可以尝试将文件分片散上传。 这样的技术就叫做分片上传。分片上传就是将大文件分成一个个小文件(切片),将切片进行

    2024年04月11日
    浏览(50)
  • 如何使用Vue实现Excel表格数据的导入,在前端实现Excel表格文件的上传和解析,并使用Table组件将解析出来的数据展示在前端页面上

    随着互联网的发展和社会的进步,各个行业的数据量越来越大,对于数据的处理变得越来越重要。其中,Excel表格是一种重要的数据处理工具。在前后端项目中,实现Excel表格的导入和导出功能也愈加常见。这篇文章将介绍如何使用Vue实现Excel表格数据的导入。 在开始介绍实现

    2024年02月11日
    浏览(66)
  • 大文件分片上传的实现【前后台完整版】

    在一般的产品开发过程中,大家多少会遇到上传视频功能的需求,往往我们采用的都是对视频大小进行限制等方法,来防止上传请求超时,导致上传失败。这时候可能将视频分片上传可以对你的项目有一个小小的体验优化。 本片文章前端是vue,后台基于PHP进行的分片上传,需

    2024年02月10日
    浏览(54)
  • 若依微服务中的上传文件的前后端实现

    前端: :limit用来控制上传文件数量的默认一 后端 若依项目自带的详情自己下载自己去找service层去看吧

    2024年02月01日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包