vue前端
<template><div><button @click="downloadFile">Download File</button></div>
</template><script>
import axios from 'axios';export default {methods: {async downloadFile() {try {const response = await axios.get('http://your-backend-url/download', {responseType: 'blob' // 告诉axios响应的数据类型为Blob});const blob = new Blob([response.data], { type: 'application/octet-stream' });const url = window.URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.setAttribute('download', 'filename.ext'); // 设置下载文件的文件名document.body.appendChild(link);link.click();document.body.removeChild(link);} catch (error) {console.error('Error downloading file:', error);}}}
}
</script>
java后端代码
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;@Controller
@RequestMapping("/download")
public class FileDownloadController {@GetMappingpublic ResponseEntity<Resource> downloadFile() {// 指定要下载的文件路径String filePath = "/path/to/your/file.ext";Path path = Paths.get(filePath);Resource resource;String contentType;try {// 从文件路径创建一个资源对象resource = new UrlResource(path.toUri());// 根据文件扩展名动态设置 Content-TypecontentType = determineContentType(resource.getFilename());} catch (IOException e) {e.printStackTrace();return ResponseEntity.notFound().build();}// 检查资源是否存在并且可读if (!resource.exists() || !resource.isReadable()) {return ResponseEntity.notFound().build();}// 尝试下载文件try {return ResponseEntity.ok().contentType(MediaType.parseMediaType(contentType))// 设置响应内容类型为流数据.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"") // 设置下载文件的文件名.body(resource); // 返回资源对象} catch (Exception e) {e.printStackTrace();// 如果下载失败,//return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("下载文件失败,请稍后重试。");}}// 根据文件扩展名返回对应的 Content-Typeprivate String determineContentType(String filename) {String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();switch (extension) {case "pdf":return "application/pdf";case "txt":return "text/plain";case "doc":case "docx":return "application/msword";case "xls":case "xlsx":return "application/vnd.ms-excel";// 其他文件类型...default:return "application/octet-stream"; // 默认为二进制数据流}}
}