用java写一个文件下载接口提供给vue前端使用
时间: 2024-03-23 10:42:56 浏览: 85
好的,下面是一个简单的使用 Java 编写文件下载接口的示例代码。
假设你的文件下载接口是 `/download`,接收一个参数 `file` 表示文件名,那么可以使用 Spring Boot 框架来编写接口。
首先,需要在 Spring Boot 的配置文件中设置文件上传和下载的临时目录:
```
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=2MB
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=50MB
spring.servlet.multipart.location=/tmp
```
然后,在控制器中定义文件下载接口:
```java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.http.MediaType;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.nio.file.Path;
import java.nio.file.Paths;
@Controller
public class DownloadController {
@GetMapping("/download")
@ResponseBody
public ResponseEntity<Resource> downloadFile(@RequestParam("file") String fileName) {
try {
// 获取文件路径
Path path = Paths.get("/tmp/" + fileName);
Resource resource = new UrlResource(path.toUri());
// 构造响应头
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"");
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
return ResponseEntity.ok()
.headers(headers)
.body(resource);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.notFound().build();
}
}
}
```
上面的代码中,`downloadFile` 方法接收一个文件名 `fileName`,然后通过 `Paths.get` 方法获取文件路径,使用 `UrlResource` 对象将文件封装为 `Resource` 对象,最后构造响应头并返回文件内容。
在前端中,可以通过 axios 库来调用文件下载接口:
```javascript
axios({
url: '/download',
method: 'GET',
responseType: 'blob',
params: {
file: 'your-file-name'
}
}).then(response => {
const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement('a')
link.href = url
link.setAttribute('download', 'your-file-name')
document.body.appendChild(link)
link.click()
})
```
上面的代码中,`axios` 方法中的 `responseType` 参数设置为 `blob`,表示返回的数据是二进制数据,然后通过 `Blob` 对象将数据转换为文件,最后使用 a 标签模拟点击下载。
阅读全文