vue实现文件上传和下载_vue上传文件前端完整实例

vue实现文件上传和下载_vue上传文件前端完整实例文件上传这里使用elementui组件库的文件上传组件1.手动上传(文件选取后需点击确认上传)action:上传地址auto-upload:是否在选取文件后立即进行上传,默认true手动上传要将其设置为falsebefore-upload:上传文件之前的钩子,参数为上传的文件,上传格式的规定要求可在此钩子函数中写(示例中规定上传格式xlsx或xls)on-success:文件上传成功时的钩子,function(response,file,fileList)ref:注册DOM对象(点

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文件上传

这里使用elementui组件库的文件上传组件

1.手动上传(文件选取后需点击确认上传)

  • action:上传地址
  • auto-upload:是否在选取文件后立即进行上传,默认true手动上传要将其设置为false
  • before-upload :上传文件之前的钩子,参数为上传的文件,上传格式的规定要求可在此钩子函数中写(示例中规定上传格式xlsx或xls)
  • on-success :文件上传成功时的钩子,function(response, file, fileList)
  • ref :注册DOM对象(点击确认上传时获取dom元素并进行一些操作)
<template>
	<div>
		<el-upload
		    class="upload-demo"
		     ref="uploadFile"     
		     :action="actionUrl"
		     :before-upload="beforeFileUpload"
		     :auto-upload="false"
		     :on-success='onSuccess'
		     :on-error="onError">
		     <el-button size="small" type="primary">选择文件</el-button>
		</el-upload>
		<el-button type="primary" @click="submitUpload">确认上传</el-button>
	</div>
</template>
import { 
    BASE_URL_Manage } from 'config'
export default { 
     
    data () { 
   
        return { 
         
          actionUrl: BASE_URL_Manage+'/webManage/upload', // 上传地址 
        }
    },
    methods:{ 
   
    	//确认上传
    	submitUpload() { 
   
        	this.$refs.uploadFile.submit();
      	},
      	 //文件上传之前
        beforeFileUpload(file){ 
   
            const File = file.name.replace(/.+\./,"");
            if (['xlsx','xls'].indexOf(File.toLowerCase())===-1 ) { 
   
                this.$message.error('只支持上传xlsx、xls文件格式!');
                this.$refs.uploadFile.clearFiles();
                return false;
            }            
        },
         //文件上传成功
        onSuccess(){ 
   
            this.$message.success("文件上传成功");       
        },
        //上传失败
        onError(){ 
   
             this.$refs.upload.clearFiles();
             this.$message.error("文件上传失败")
        }
    }
}

2.立即上传(文件选取后将自动上传)

上传组件去掉 auto-uploadref 即可

<template>
	<div>
		<el-upload
		    class="upload-demo"	       
		     :action="actionUrl"
		     :before-upload="beforeFileUpload"	     
		     :on-success='onSuccess'
		     :on-error="onError">
		     <el-button size="small" type="primary">上传文件</el-button>
		</el-upload>
	</div>
</template>
import { 
    BASE_URL_Manage } from 'config'
export default { 
     
    data () { 
   
        return { 
         
          actionUrl: BASE_URL_Manage+'/webManage/upload', // 上传地址 
        }
    },
    methods:{ 
   	
      	 //文件上传之前
        beforeFileUpload(file){ 
   
            const File = file.name.replace(/.+\./,"");
            if (['xlsx','xls'].indexOf(File.toLowerCase())===-1 ) { 
   
                this.$message.error('只支持上传xlsx、xls文件格式!');
                this.$refs.uploadFile.clearFiles();
                return false;
            }            
        },
         //文件上传成功
        onSuccess(){ 
   
            this.$message.success("文件上传成功");       
        },
        //上传失败
        onError(){ 
   
             this.$refs.upload.clearFiles();
             this.$message.error("文件上传失败")
        }
    }
}

3.上传文件(借助el-upload组件选取文件,自行调上传接口)

  • on-change:文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用, function(file, fileList)
  • on-remove:文件列表移除文件时的钩子, function(file, fileList)
  • limit:最大允许上传文件的个数
<template>
	<div>
		<el-upload
		    class="upload-demo"
		     ref="uploadFile"     
		     :action="-"
		     :auto-upload="false" 
		     :limit="1"     
		     :on-change="onChangeFile"
			 :on-remove="onRemoveFile">
		     <el-button size="small" type="primary">选择文件</el-button>
		</el-upload>
		<el-button type="primary" @click="submitUpload">上传文件</el-button>
	</div>
</template>
import * as api from "@/api/userPage/index";
export default { 
     
    data () { 
   
        return { 
         
          userFile: null, // 上传的文件 
        }
    },
    methods:{ 
   
    	//确认上传
    	submitUpload() { 
   
    		if(this.userFile==null){ 
   
    			return this.$message.error("请先选取文件!"); 
    		}   			 			   		
    		//文件上传添加上传参数(若无需添加参数则直接传this.userFile给接口)
    		const formdata = new FormData();
          	formdata.append("file", this.userFile);
          	formdata.append("user","张三");	
          	//传对象参数,需转成json字符串形式
          	let tick={ 
   
          		code:"fdgfhgghg",
          		uid:"4566895623"
          	}
          	formdata.append("ssoTick",JSON.stringify(tick));	
          	//调用上传接口 
    		api.upload(formdata).then(res => { 
   			
			    if (res.code == 200) { 
   				
					this.$message.success("上传成功");							
				}else{ 
   
					this.$message.error(res.msg);
				}
			});      	
      	},
      	//文件上传改变
		onChangeFile(file, arr){ 
   
			//限制文件大小 
			let isLt2M = file.raw.size / 1024 / 1024 < 2;
			if(!isLt2M){ 
   
				this.$refs.uploadFile.clearFiles();
				return this.$message.error('上传文件大小不能超过 2MB!');
			}			
			this.userFile = file.raw;		
		},
		//文件移除
		onRemoveFile(){ 
   			
			this.userFile=null;
		},
    }
}

api/userPage/index.js文件

import { 
    createService } from '@/api/fetch-auth' 
import { 
    BASE_URL_Manage } from 'config'
var fetch = createService('Timstar')
//文件上传
export function upload (data) { 
   
  return fetch({ 
   
    url: BASE_URL_Manage + '/targetmanager/upload',
    method: 'post',
    data,
    transformRequest(data) { 
   
      return data;
    },
    headers: { 
   
        "Content-Type": "multipart/form-data"
    }
  })
}

文件下载

针对文件下载请求,后端返回给前端是文件流的形式
使用 axios

axios.post(请求路径URL, { 
   参数Params}, { 
   
     responseType: 'blob'
     }).then(function(res){ 
   
	      //创建a标签
        let aLink=document.createElement('a');
        //兼容不同浏览器的url对象
        const URL=window.URL||window.webkitURL||window.moxURL;
        aLink.href=URL.createObjectURL(res.data);
       	//将创建的a标签添加到body中
        document.body.appendChild(aLink);
        //获取文件名
        aLink.download= decodeURIComponent(res.headers['content-disposition'].split(';')[1].split('fileName=')[1]);
        aLink.click();
        //移除aLink节点
        document.body.removeChild(aLink);
        //销毁url对象
        URL.revokeObjectURL(aLink.href);
       }
});

需注意的几个地方

  • 设置请求返回类型, responseType: ‘blob’
  • 获取文件名 headers[‘content-disposition’].split(’;’)[1].split(‘fileName=’)[1]
  • decodeURIComponent() 解码URI
    可以看看具体后端返回给你的响应头里的内容
    在这里插入图片描述
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170636.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2022年编程语言排名,官方数据来了,让人大开眼界。「建议收藏」

    2022年编程语言排名,官方数据来了,让人大开眼界。「建议收藏」之所以说这件事,就是想告诉同学们,努力固然重要,但选择必须要对,一旦选择错了,那很多努力都是白费。这篇文章就是来给同学们提个醒,2022年最好的编程语言是什么?看完后你就知道该如何地去选择了。

    2022年5月7日
    382
  • 渗透测试常用工具汇总_常用渗透测试工具

    渗透测试常用工具汇总_常用渗透测试工具——D&X安全实验室工欲善其事,必先利其器。回到过去的旧时代,渗透测试是一件非常困难的事,并且需要大量的手动操作。然而如今,渗透测试工具是”安全军火库”中最常使用的装备,一整套的自动化测试工具似乎不仅改造了渗透测试人员,甚至还可以增强计算机的性能,进行比以往更全面的测试。对渗透测试人员来说不用任何自动化工具对网站或者应用程序进行渗透测试是一件十分困难的事。因此选择一个正确的工具则变得尤为重要,正确的选择甚至占去了渗透测试成功的半壁江山。本篇文章就来和大家介绍一…

    2022年8月12日
    4
  • winrar去广告的方法_mt管理器去广告教程

    winrar去广告的方法_mt管理器去广告教程一、前言1.1Winrar解压缩工具市场上有很多优秀的压缩工具,常用的有Winrar和360压缩工具。Winrar是免费压缩工具,特色是每次使用都会弹出广告。影响用户体验和工作效率,当然最

    2022年8月2日
    13
  • java并发之SynchronousQueue实现原理[通俗易懂]

    java并发之SynchronousQueue实现原理[通俗易懂]前言SynchronousQueue是一个比较特别的队列,由于在线程池方面有所应用,为了更好的理解线程池的实现原理,笔者花了些时间学习了一下该队列源码(JDK1.8),此队列源码中充斥着大量的CAS语句,理解起来是有些难度的,为了方便日后回顾,本篇文章会以简洁的图形化方式展示该队列底层的实现原理。SynchronousQueue简单使用经典的生产者-消费者模式,操作流程是这样的:有多个生产者,可以并

    2022年6月22日
    79
  • Android 原始套接字

    Android 原始套接字

    2021年9月10日
    82
  • python的sorted函数「建议收藏」

    python的sorted函数「建议收藏」sorted很简单,没太多好写的,只是给自己做个笔记。sorted接受三个参数,返回一个排序之后的list。第一个接受一个可迭代的对象(因为sorted实现了迭代协议,所以接受的参数不一定需要l

    2022年7月5日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号