Java实例:Vue前端与Java后端实现大文件异步上传下载功能

南春编程 2024-04-11 22:18:41
在我们项目开发中,大文件上传与下载是一项常见的功能需求,特别是在高并发和用户体验要求高的场景下。Vue.js作为一款流行的前端框架,以其响应式的数据绑定和组件化的优势使得前端交互更加流畅;而Java后端凭借其稳定性和高性能,是构建健壮服务端的理想选择。 老规矩,多余话不说,直接上实现思路与代码。 大文件异步上传功能实现思路: 前端: 使用HTML5的FormData API封装文件信息,可通过new FormData()并将file对象添加到表单数据中。利用axios或其他HTTP库发送POST请求,设置请求头Content-Type为'multipart/form-data'以适应文件上传。实现进度条功能,通过监听xhr.upload.onprogress事件实时更新上传进度。后端: 接收multipart请求,使用如Commons FileUpload或Spring Boot自带的MultipartFile接口解析文件。文件暂存于临时目录或直接上传至云存储服务,如OSS或S3。后端处理完成后返回相应状态码和信息,以便前端显示上传结果。大文件异步下载功能实现思路: 前端: 前端通过点击事件触发下载动作,向后端发送请求获取文件下载链接或者流式响应。对于较大的文件,可以创建隐藏的iframe或者a标签配合download属性,由服务器返回合适的Content-Disposition头来触发浏览器下载。后端: 根据请求生成文件下载的响应,设置适当的Content-Type和Content-Disposition头部信息。若采用流式传输,可使用Servlet的OutputStream逐块读取文件并发送给客户端,减轻内存压力。思路有了,直接上代码: 前端Vue部分(使用axios): 前端Vue部分,我们将创建一个简单的上传组件,该组件包括一个文件输入框和一个进度条,用于展示上传进度。这里假设你已经设置了axios,并全局导入。 上传进度: {{ uploadProgress }}% // Vue组件内方法async handleFileUpload(file) { const formData = new FormData(); formData.append('file', file); // 'file' 是从元素获取的文件对象 const config = { headers: { 'Content-Type': 'multipart/form-data' }, onUploadProgress: progressEvent => { this.progress = Math.round((progressEvent.loaded * 100) / progressEvent.total); } }; try { const response = await axios.post('/api/upload', formData, config); console.log(response.data); // 处理后端返回的信息 } catch (error) { console.error(error); }}后端Java Spring Boot部分(接收文件): import org.springframework.web.multipart.MultipartFile;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.http.ResponseEntity;@RestControllerpublic FileController { @PostMapping("/api/upload") public ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return ResponseEntity.badRequest().body("Failed to upload, no file content found."); } // 获取文件名及扩展名 String originalFilename = file.getOriginalFilename(); // 将文件保存到指定路径,这里仅为示例,生产环境中需要考虑磁盘空间、文件命名策略等问题 try { Path path = Paths.get(UPLOADED_FOLDER_PATH + originalFilename); Files.write(path, file.getBytes()); return ResponseEntity.ok("File uploaded successfully"); } catch (IOException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("Failed to upload the file: " + e.getMessage()); } }}对于大文件下载,通常后端会提供一个下载链接,前端接收到此链接后,可以通过创建隐藏的
0 阅读:0

南春编程

简介:感谢大家的关注