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.RequestParam;
import java.net.MalformedURLException;
import java.nio.file.Path;
import java.nio.file.Paths;
@Controller
public class FileDownloadController {
@GetMapping("/download")
public ResponseEntity<Path> downloadFile(@RequestParam String url, @RequestParam String filename) {
try {
// 将传入的下载链接转换为UrlResource
UrlResource urlResource = new UrlResource(this.getClass().getResource(url));
if (!urlResource.exists() || !urlResource.isReadable()) {
throw new RuntimeException("Could not read the file!");
}
// 构建HTTP响应头
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");
headers.add(HttpHeaders.CACHE_CONTROL, "must-revalidate, post-check=0, pre-check=0");
// 根据文件类型设置Content-Type
String contentType = null;
try {
contentType = urlResource.getContentType();
} catch (MalformedURLException e) {
// Handle the exception
}
if (contentType == null) {
contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
}
headers.setContentType(MediaType.parseMediaType(contentType));
// 返回ResponseEntity,其中包含文件内容和HTTP头信息
return ResponseEntity.ok()
.headers(headers)
.contentLength(urlResource.contentLength())
.body(Paths.get(urlResource.getURI()));
} catch (Exception e) {
// 处理异常情况,例如文件不存在或读取错误
e.printStackTrace();
return ResponseEntity.internalServerError().build();
}
}
}