方式1,比较古老的方式:
@RestController("/download")
public class FileDownloadController {
@GetMapping("/downloadFile")
public ResponseEntity downloadFile(String path,HttpServletResponse response){
path = "D:\\Users\\lvxy\\Downloads\\Feishu-win32_ia32-4.3.7-signed.exe";
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
/* 与上等同
HttpHeaders headers = new HttpHeaders();
//将编码加到http头信息中
headers.setContentDispositionFormData("attachment", filename);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.add("isSuccess", "true");
return new ResponseEntity<>(file, headers, HttpStatus.CREATED);
*/
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return (ResponseEntity) response;
}
/**
* 下载网络文件
* @param response
* @throws MalformedURLException
*/
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
// 下载网络文件
int bytesum = 0;
int byteread = 0;
URL url = new URL("windine.blogdriver.com/logo.gif");
try {
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = new FileOutputStream("c:/abc.gif");
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//支持在线打开文件的一种方式
public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
File f = new File(filePath);
if (!f.exists()) {
response.sendError(404, "File not found!");
return;
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
if (isOnLine) { // 在线打开方式
URL u = new URL("file:///" + filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
// 文件名应该编码成UTF-8
} else { // 纯下载方式
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
}
方式2,使用spring的resource接口:
@RestController
public class XliffParserController {
@Autowired
private DealXliffService dealXliffService;
@SneakyThrows
@GetMapping("/downloadFile")
public ResponseEntity<Resource> downloadFile(Long catProjectId, Long catFileId, String fileType, MultipartFile xliffFile, HttpServletResponse response) {
List<CatDocument> res = dealXliffService.xliffParser(catProjectId, catFileId, fileType, xliffFile);
// 需要写入的数据
String json = JSONUtil.toJsonStr(res);
// 生成文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String xliffFileName = xliffFile.getOriginalFilename();
String jsonFileName = uuid + "_" + xliffFileName + ".json";
String jsonName = xliffFileName + ".json";
// 写文件
File file = FileUtils.saveFile(Path.JSON + jsonFileName);
FileUtils.write2File(json, file);
String contentDisposition = ContentDisposition
.builder("attachment")
.filename(jsonName)
.build().toString();
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
.contentType(MediaType.MULTIPART_FORM_DATA)
.body(new FileSystemResource(file));
}
}
或者
public static ResponseEntity<FileSystemResource> downloadReturn(String fileName, File file){
if (!file.isFile()) {
try {
throw new FileNotFoundException();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
HttpHeaders headers = new HttpHeaders();
headers.add("content-length",((Long)file.length()).toString());
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
try {
fileName = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
fileName = fileName.replaceAll("\\+","%20");
headers.add("Content-Disposition", "attachment;filename=" + fileName);
HttpStatus status = HttpStatus.OK;
return new ResponseEntity<>(new FileSystemResource(file), headers, status);
}
/**
* @ClassName: FileUtils
* @Date: 2022/2/22
* @Author: lvxy
*/
public class FileUtils {
/**
* 创建文件
* @param filePath 文件路径
* @return 文件
*/
public static File saveFile(String filePath){
File file = new File(filePath);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();// 创建多级目录
}
return file;
}
/**
* 向指定文件写内容
* @param json 写入字符
* @param file 文件
*/
public static void write2File(String json, File file) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter,1024);
bufferedWriter.write(json);
bufferedWriter.flush();
// close
fileOutputStream.close();
outputStreamWriter.close();
bufferedWriter.close();
}
}