VUE+SpringBoot文件上传与下载

本文介绍了如何在Vue与SpringBoot应用中使用antd的a-upload组件进行文件上传,强调了二进制流处理和Content-Type设置的重要性,并提供了下载文件的后端处理方法,包括数组接收和压缩文件的建议。还讨论了ArrayBuffer和Blob的区别及其在下载操作中的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

使用VUE+SpringBoot实现文件的上传与下载,使用antd的a-upload作为上传按钮(样式),遇到了问题,这里记录一下。

上传

  • 文件在上传时,通过formData.append拼接字段,注意红框部分,这里的file最后是一个二进制流,不要把一个file对象传过去,不然后端的MultipartFile接收不到
  • 上传这里需要注意,我们的Content-type需要写成multipart/form-data ,否则application/json(序列化后的 JSON 字符串),application/x-www-form-urlencoded(浏览器默认,原生 form 表单)
  • 如果是多个文件的上传,不要传file数组或二进制数组!!!否则后端接收不到值,如果有这种需求,可以继续append,key可以重复,value不会覆盖,后端使用数组来接收。

下载

  • 后端的下载这里简单说一下:首先是通过response拿到输出流对象,然后写入response中。上图来自网站:https://blog.youkuaiyun.com/javaloveiphone/article/details/8133772,作者:逍遥不羁

  • 如果到下载多个文件,建议打成一个zip文件或多次调用下载文件接口

  • 前端这里的responseType要写成arraybuffer,我们会拿到一个ArrayBuffer的返回值,根据该对象创建一个Blob对象,创建一个不可见的超链接,链接地址是根据Blob创建的URL,模拟点击然后再删除改超链接

  • ArrayBuffer和Blob区别如下(来自:https://blog.youkuaiyun.com/weixin_41849462/article/details/103409341 作者:张贺_)

### 使用 Vue 和 Spring Boot 实现文件上传下载 #### 文件上传部分 为了实现文件上传的功能,前端使用 Vue.js 来构建用户界面,并通过 HTTP 请求将文件发送给后端服务器。而后端则采用 Spring Boot 接收这些请求并将文件存储起来。 ##### 前端代码示例(Vue) 在 Vue 中可以通过 `axios` 库发起 POST 请求来提交表单数据以及文件流: ```javascript import axios from 'axios'; export default { methods: { async submitFile() { const formData = new FormData(); formData.append('file', this.selectedFile); try { await axios.post('/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); console.log('Upload successful'); } catch (error) { console.error('There was an error uploading the file!', error); } }, handleFileSelect(event){ this.selectedFile = event.target.files[0]; } } } ``` 此段脚本定义了一个名为 `submitFile()` 的方法用于处理文件的选择上传操作[^1]。 ##### 后端代码示例(Spring Boot) 对于接收文件的部分,在控制器类中声明一个映射路径 `/upload` 并设置其支持 POST 方法。当有新的文件被上传时会触发该接口下的函数执行相应的业务逻辑: ```java @RestController @RequestMapping("/api") public class FileUploadController { @PostMapping("/upload") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) throws IOException { if(file.isEmpty()){ return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Please select a file to upload."); } // Save uploaded file on server... Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename()); Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING); return ResponseEntity.ok("You successfully uploaded '" + file.getOriginalFilename() + "'"); } } ``` 这段 Java 代码片段展示了如何创建 RESTful API 来接受来自客户端的多部件形式的数据包,并将其保存至指定位置上[^2]。 #### 文件下载部分 同样地,要让应用程序能够响应用户的下载请求也需要前后两端共同协作完成这项工作。 ##### 前端代码示例(Vue) 为了让用户可以从浏览器获取远程资源,可以在组件内部编写如下所示的方法调用: ```javascript async downloadFile(filename) { try{ let response = await fetch(`/api/download/${filename}`); const blob = await response.blob(); var link=document.createElement('a'); link.href=URL.createObjectURL(blob); link.download = filename; document.body.appendChild(link); link.click(); URL.revokeObjectURL(link.href); document.body.removeChild(link); }catch(error){ console.error('Error during downloading:', error.message); } }, ``` 上述 JavaScript 函数负责向特定地址发出 GET 请求以取得目标二进制对象,之后再利用 HTML5 提供的新特性自动弹出另存对话框让用户选择保存地点[^4]。 ##### 后端代码示例(Spring Boot) 最后一步是在服务层准备好可供访问的目标实体及其元信息以便于返回给调用者: ```java @GetMapping("/download/{fileName:.+}") @ResponseBody public FileSystemResource getFile( @PathVariable String fileName, HttpServletResponse response) throws Exception { Path filePath = Paths.get(DOWNLOAD_PATH + "/" + fileName); if (!Files.exists(filePath)) { throw new FileNotFoundException(fileName + " not found on server"); } response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setHeader(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename=\"" + URLEncoder.encode(fileName,StandardCharsets.UTF_8.toString())+"\""); return new FileSystemResource(filePath.toFile()); } ``` 这个处理器用来匹配所有形如 `/download/*` 的 URI 模式,并尝试读取对应的磁盘上的实际文件作为回应的一部分传回给客户机。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值