前后端分离,文件上传下载(springBoot+vue+elementUI)

       文件上传与下载是比较常见的功能,比如上传附件和头像等等,本篇博客主要讲前后端分离的情况下,如何实现文件上传下载,写的是demo,完整功能可参考 springBoot+shiro+vue的学生管理系统(二、总体功能及登录功能) ,新增文件上传下载的功能,都是在它的基础之上完成的。这里会用到elementUI的组件:

el-upload

一、文件上传:

先看前端代码:

(1)利用el-upload实现文件上传

		   <el-upload class="upload-demo"
						 :action="uploadUrl" 
						 :before-upload="handleBeforeUpload"  
						 :on-error="handleUploadError" 
						 :before-remove="beforeRemove" 
						 multiple 
						 :limit="5"
						 :on-exceed="handleExceed" 
						 :file-list="fileList">
		      <el-button size="small" type="primary">点击上传</el-button>
		   </el-upload>

(2)在vue的data里面声明对应的属性和方法

 uploadUrl: 'http://192.168.43.152:8089/file/upload',
 fileList: [],

第一个是上传的路径,第二个是上传文件的数组

下面是处理文件上传的方法,主要看handleBeforeUpload(file)这个方法,其实方法都是做一些限制和提示:

			      handleExceed(files, fileList) {
			        this.$message.warning(`当前限制选择 5 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
			      },
			      beforeRemove(file, fileList) {
			        return this.$confirm(`确定移除 ${ file.name }?`);
			      },
			      handleUploadError(error, file) {
			      console.log("文件上传出错:"+error)
			       // this.$notify.error({
			       //          title: 'error',
			       //          message: '上传出错:' +  error,
			       //          type: 'error',
			       //          position: 'bottom-right'
			       //        })
			    },
			    //测试上传文件(注意web的上下文)
			    handleBeforeUpload(file){
					this.uploadUrl = 'http://192.168.43.152:8089/file/upload'
					console.log("开始上传,上传的文件为:"+file)
					let formData = new FormData();
					formData.append("multipartFiles", file);
					axios({
						  method: 'post',
						  url: 'http://192.168.43.152:8089/file/upload',
						  data: formData,
						  headers: {'Content-Type': 'multipart/form-data' }
					  }).then((res) => {
						  console.log("文件上传返回:"+res)
					  }).catch(error => {
						  console.log("文件上传异常:"+error)
					  })
					
			         // this.uploadUrl ='http://192.168.43.152:8089/file/upload'
			    },

使用handleBeforeUpload(file)来实现文件上传,主要是因为elementUI的action用不了,我测试的时候是这样,不知道是不是bug

 

现在看后端代码:

    private  final static String rootPath = "D:/attachment/";
    @RequestMapping("/upload")
    public Object uploadFile(MultipartFile[] multipartFiles){
        File fileDir = new File(rootPath);
        if (!fileDir.exists() && !fileDir.isDirectory()) {
            fileDir.mkdirs();
        }
        try {
            if (multipartFiles != null && multipartFiles.length > 0) {
                for(int i = 0;i<multipartFiles.length;i++){
                    try {
                        //以原来的名称命名,覆盖掉旧的,这里也可以使用UUID之类的方式命名,这里就没有处理了
                        String storagePath = rootPath+multipartFiles[i].getOriginalFilename();
                        System.out.println("上传的文件:" + multipartFiles[i].getName() + "," + multipartFiles[i].getContentType() + "," + multipartFiles[i].getOriginalFilename()
                                +",保存的路径为:" + storagePath);
                        // 3种方法: 第1种
//                        Streams.copy(multipartFiles[i].getInputStream(), new FileOutputStream(storagePath), true);
                        // 第2种
//                        Path path = Paths.get(storagePath);
//                        Files.write(path,multipartFiles[i].getBytes());
                        // 第3种
                        multipartFiles[i].transferTo(new File(storagePath));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        //前端可以通过状态码,判断文件是否上传成功
        return ResultUtil.result(EnumCode.OK.getValue(),"文件上传成功");
    }

后端主要的转换为流写入。

 

二、文件下载

文件下载,其实用个a标签就可以了,将上传成功的文件名返回给前端就可以了:

<a href="http://192.168.43.152:8089/file/download?fileName=11.xls">下载附件</a>

这里,因为是测试,我就直接写死了文件名

 

后端代码:

    /**
     *
     * @param fileName 文件名
     * @param response
     * @return
     */
    @RequestMapping("/download")
    public Object downloadFile(@RequestParam String fileName, HttpServletResponse response){
        OutputStream os = null;
        InputStream is= null;
        try {
            // 取得输出流
            os = response.getOutputStream();
            // 清空输出流
            response.reset();
            response.setContentType("application/x-download;charset=utf-8");
            //Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,
            // 保存类型以Content中设置的为准。注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。
            //把文件名按UTF-8取出,并按ISO8859-1编码,保证弹出窗口中的文件名中文不乱码,中文不要太多,最多支持17个中文,因为header有150个字节限制。
            response.setHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes("utf-8"),"ISO8859-1"));
            //读取流
            File f = new File(rootPath+fileName);
            is = new FileInputStream(f);
            if (is == null) {
                System.out.println("下载附件失败,请检查文件“" + fileName + "”是否存在");
                return ResultUtil.result(EnumCode.INTERNAL_SERVER_ERROR.getValue(),"下载附件失败,请检查文件“" + fileName + "”是否存在");
            }
            //复制
            IOUtils.copy(is, response.getOutputStream());
            response.getOutputStream().flush();
        } catch (IOException e) {
            return ResultUtil.result(EnumCode.INTERNAL_SERVER_ERROR.getValue(),"下载附件失败,error:"+e.getMessage());
        }
        //文件的关闭放在finally中
        finally
        {
            try {
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //其实,这个返回什么都不重要
        return ResultUtil.result(EnumCode.OK.getValue(),"下载成功");
    }

 

  • 16
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: springboot+vue+elementui 是一种常见的前后端分离开发框架组合,其中 springboot 作为后端框架,提供了丰富的开发工具和便捷的配置方式;vue 作为前端框架,提供了组件化开发和响应式数据绑定等特性;elementui 则是一套基于 vue 的 UI 组件库,提供了丰富的 UI 组件和样式,可以快速搭建出美观的前端界面。这种组合方式可以提高开发效率,降低开发成本,是现代化 Web 应用开发的主流选择之一。 ### 回答2: Spring Boot、VueElementUI 三者都是现代企业级的 Web 开发框架,各自拥有特色和优势,同时也有着协同工作的潜力。 Spring Boot 是一款基于 Java 编写并运行的轻量级 Web 框架,其主要目标是简化 Spring 应用的搭建和设计。它提供了一个快速开发应用的高效率方式,使得开发者可以专注于业务逻辑的实现,而无需关注底层设施和配置文件细节。 Vue 是一个流行的 JavaScript 前端框架,它可以帮助开发者构建可复用和可扩展的网络应用程序。特别是其数据绑定和组件化系统,在开发高度交互的 UI 应用时具有很大的优势。 ElementUI 是一套基于 Vue 的前端 UI 组件库,它提供了多种常用的 UI 元素和样式。ElementUI 的组件样式比较简洁美观,同时还提供了灵活和自定义的主题功能,开发者可以根据自己的需求轻松实现不同的组件样式。 Spring Boot 和 Vue 配合使用时,前端使用 Vue 展示,后端使用 Spring Boot 导出数据和服务。Vue 支持使用 Axios、Fetch 等方式进行异步请求,从而获取后端数据,以响应前端的操作。ElementUI 可以帮助开发者快速搭建整个 Web 应用程序的前端界面,减轻前端开发的工作量。 综上所述,Spring Boot、VueElementUI 三者共同使用,可以在开发 Web 应用时提高开发效率,更快地构建出高质量的应用程序。同时,该组合也能够帮助开发者在后端和前端之间良好地维持数据的交互和一致性。 ### 回答3: SpringBoot是一款开源的Java开发框架,它主要用于快速构建企业级应用程序。SpringBoot通过减少XML配置来简化Spring应用程序的开发过程,并且内嵌了Tomcat、Jetty和Undertow等常用的Web容器,从而大大简化了Web应用程序的部署步骤。 Vue是一款前端框架,它可以帮助开发人员更加轻松地构建复杂的单页面应用程序。Vue的主要特点是组件化和响应式编程。Vue提供了强大的模板和数据绑定功能,使得开发人员可以很方便地实现一些复杂的应用程序。 ElementUI是一款基于Vue.js的UI框架。它提供了一系列高质量的组件,如表格、日期选择器、对话框、按钮等等,可以大大加速Web应用程序的开发过程。ElementUI提供了丰富的主题和设计语言,可以满足不同应用场景的需要。 SpringBootVueElementUI的结合,可以帮助开发人员更快地构建现代化的Web应用程序。SpringBoot提供了强大的后端支持,包括数据访问层、事务管理等等,可以快速构建可靠的后端服务。VueElementUI则提供了丰富的前端组件和模板,可以帮助开发人员更快地搭建出漂亮的界面。同时,Vue的响应式编程和ElementUI的组件化设计可以帮助开发人员更快地实现复杂的前端逻辑。 总之,SpringBootVueElementUI的结合可以帮助开发人员更快地构建高质量的Web应用程序,提供了丰富的工具和组件,可以满足不同应用场景的需要。它们的协作和衔接,展示了强大的开发效率和组件之间的友好结合。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值