本例是通过response.setContentType(“application/octet-stream”);返回文件的字节流方式下载文件。
maven依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
自定义Result
package com.common.form;
/**
* @program: Demo
* @Date: 2019/3/4 21:54
* @Author: LiJc
* @Description:
*/
public class Result {
private String message;
private boolean isSuccess = false;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isSuccess() {
return isSuccess;
}
public void setSuccess(boolean success) {
isSuccess = success;
}
}
DownloadFileService
package com.common.service;
import com.common.form.Result;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
/**
* @program: Demo
* @Date: 2019/3/4 21:42
* @Author: LiJc
* @Description:
*/
@Service
public class DownloadFileService {
private String uploadfolder;
public String getUploadfolder() {
if(StringUtils.isEmpty(uploadfolder)){
uploadfolder = "D:\\upload";
}
return uploadfolder;
}
public void setUploadfolder(String uploadfolder) {
this.uploadfolder = uploadfolder;
}
public Result download(String fileUrl, String fileName, HttpServletRequest request, HttpServletResponse response) {
Result result = new Result();
if(StringUtils.isEmpty(fileUrl)){
result.setMessage("路径为空!");
result.setSuccess(false);
}
String filePath = getUploadfolder() + "/" + fileUrl;
File file = new File(filePath);
if (file.isFile() && file.exists()) {
try {
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[inputStream.available()]; // int
// available()
// 返回值为流中尚未读取的字节的数量
inputStream.read(buffer);
inputStream.close();
response.reset();
String header = request.getHeader("User-Agent").toUpperCase();
if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
fileName = URLEncoder.encode(fileName, "utf-8");
} else {
fileName = new String(fileName.getBytes(), "ISO8859-1");
}
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
response.addHeader("Content-Length", "" + file.length());
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
result.setMessage("下载异常!");
result.setSuccess(false);
}
} else {
result.setMessage("文件不存在!");
result.setSuccess(false);
}
return result;
}
}
DownloadFileController
package com.common.controller;
import com.common.form.Result;
import com.common.service.DownloadFileService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @program: Demo
* @Date: 2019/3/4 22:10
* @Author: LiJc
* @Description:
*/
@Controller
@RequestMapping("download")
public class DownloadFileController {
@Inject
private DownloadFileService downloadFileService;
/**
* 执行下载操作
*
* @param fileUrl 附件URL
* @param fileUrl 附件名称
* @return
*/
@GetMapping("exec")
@ResponseBody
public Result exec(String fileUrl, String fileName, HttpServletRequest request, HttpServletResponse response){
Result result = new Result();
try {
result = downloadFileService.download(fileUrl, fileName, request, response);
} catch (Exception e) {
e.printStackTrace();
result.setMessage("下载失败!");
result.setSuccess(false);
}
return result;
}
}