以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载。
#region 文件上传 可以带参数 [HttpPost('upload')] public JsonResult uploadProject(IFormFile file, string userId) { if (file != null) { var fileDir = 'D:\\aaa'; if (!Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } //文件名称 string projectFileName = file.FileName; //上传的文件的路径 string filePath = fileDir + $@'\{projectFileName}'; using (FileStream fs = System.IO.File.Create(filePath)) { file.CopyTo(fs); fs.Flush(); } return Json('ok'); }else{ return Json('no'); } } #endregion
<template><div> <form> <input type='text' value='' v-model='projectName' placeholder='请输入项目名称'> <input type='file' v-on:change='getFile($event)'> <button v-on:click='submitForm($event)'>上传</button> </form></div></template><script>///这个组件是用于上传bdls文件的组件export default { data() { return { uploadURL: '/Home/Upload', projectName: '', file: '' }; }, methods: { getFile(event) { this.file = event.target.files[0]; console.log(this.file); }, submitForm(event) { event.preventDefault(); let formData = new FormData(); formData.append('file', this.file); let config = { headers: { 'Content-Type': 'multipart/form-data' } }; this.$http .post(this.uploadURL, formData, config) .then(function(response) { if (response.status === 200) { console.log(response.data); } }); } }};</script><style lang='scss' scoped></style>
http://element-cn.eleme.io/#/zh-CN/component/upload
<template><div> <el-upload class='upload-css' :file-list='uploadFiles' ref='upload' :on-success='upLoadSuccess' :on-error='upLoadError' :action='uploadURL' :auto-upload='false'> <el-button slot='trigger' size='small' type='primary'>选取文件</el-button> <el-button style='margin-left: 10px;' size='small' type='success' @click='submitUpload'>上传到服务器</el-button> </el-upload></div></template><script>import Vue from 'vue';import { Upload, Button } from 'element-ui';Vue.use(Upload);Vue.use(Button);export default { props: [], data() { return { projectName: '', //uploadURL: '/project/upload?a=1', uploadFiles: [] //上传的文件列表 }; }, computed: { //文件的上传路径 //附带用户id和项目名称 uploadURL: function() { //var userId = this.$store.state.userId; return '/project/upload?userId=' + 1; } }, methods: { //文件上传 submitUpload() { this.$refs.upload.submit(); }, //文件上传成功时的钩子 upLoadSuccess(response, file, fileList) { if (response == 'ok') { console.log(response + '已上传' + file); console.log('项目添加成功'); } else { console.log('项目添加失败'); } }, //文件上传失败时的钩子 upLoadError(response, file, fileList) { console.log('项目添加失败'); } }};</script><style lang='scss' scoped></style>
普通的文件下载方式是访问一个后台文件流地址,直接生成对应的文件,下载即可,地址栏中也可携带一些控制参数,但是无法通过header传递参数。
public FileResult downloadRequest() { //var addrUrl = webRootPath + '/upload/thumb.jpg'; var addrUrl = 'D:/aaa/thumb.jpg'; var stream = System.IO.File.OpenRead(addrUrl); string fileExt = Path.GetExtension('thumb.jpg'); //获取文件的ContentType var provider = new FileExtensionContentTypeProvider(); var memi = provider.Mappings[fileExt]; return File(stream, memi, Path.GetFileName(addrUrl)); }
<el-button type='primary' v-on:click='downloadRequest'>下载文件</el-button>.........downloadRequest() { let url = 'Home/downloadRequest'; //可以在路径中传递参数 window.location.href = url; },
public FileContentResult downloadRequest1() { //string webRootPath = _hostingEnvironment.WebRootPath; //var addrUrl = webRootPath + '/upload/thumb.jpg'; var addrUrl = 'D:/aaa/wyy.exe'; /*var stream = System.IO.File.OpenRead(addrUrl); string fileExt = Path.GetExtension('thumb.jpg'); //获取文件的ContentType var provider = new FileExtensionContentTypeProvider(); var memi = provider.Mappings[fileExt]; return File(stream, memi, Path.GetFileName(addrUrl));*/ //return stream; byte[] fileBytes = System.IO.File.ReadAllBytes(addrUrl); string fileName = 'wyy.exe'; return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); //关键语句 }
blob(用来存储二进制大文件)
<el-button type='primary' v-on:click='downloadRequest1'>下载文件11</el-button>......... downloadRequest1() { axios({ // 用axios发送post请求 method: 'post', url: 'Home/downloadRequest1', // 请求地址 ,也可以传递参数 headers: { //可以自定义header gggg: 'gggggggggggggggggggggggggggggggggggggggggggggggggggg' //可以携带token }, responseType: 'blob' // 表明返回服务器返回的数据类型 }).then(res => { // 处理返回的文件流 //主要是将返回的data数据通过blob保存成文件 var content = res.data; var blob = new Blob([content]); var fileName = 'wyy.exe'; //要保存的文件名称 if ('download' in document.createElement('a')) { // 非IE下载 var elink = document.createElement('a'); elink.download = fileName; elink.style.display = 'none'; elink.href = URL.createObjectURL(blob); document.body.appendChild(elink); elink.click(); URL.revokeObjectURL(elink.href); // 释放URL 对象 document.body.removeChild(elink); } else { // IE10+下载 navigator.msSaveBlob(blob, fileName); } console.log(res); }); }
联系客服