web项目中对mp4等类型文件强制下载
前端在chrome浏览器使用url下载mp4文件时,浏览器会直接打开该文件进行播放,过查阅资料最终从后端解决了该问题,并且该方法适用于所有类型的文件强制下载,具体实现步骤如下:
1、引入公共工具类方法,此方法可避免下载时,文件名出现的乱码问题。
import com.gold.stone.dto.MaterialDto;
import com.gold.stone.dto.ResultDto;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
public class DownloadUtils {
/**
* 强制前端调用后下载文件,不进行打开操作
* @param url 下载的文件地址
* @param name 文件名,文件类型后缀程序从url中截取
* @param request
* @param response
*/
public static void download(String url, String name, HttpServletRequest request, HttpServletResponse response) throws IOException {
String substring = url.substring(url.indexOf("upload/") + 7);
File file = new File(ConstantUtil.getProperty("file.path.address") + substring);
// 取得文件名。
String fileName = name + url.substring(url.lastIndexOf("."));
InputStream fis;
fis = new FileInputStream(file);
request.setCharacterEncoding("UTF-8");
String agent = request.getHeader("User-Agent").toUpperCase();
if ((agent.indexOf("MSIE") > 0) || ((agent.indexOf("RV") != -1) && (agent.indexOf("FIREFOX") == -1)))
fileName = URLEncoder.encode(fileName, "UTF-8");
else {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
}
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
response.setHeader("Content-Length", String.valueOf(file.length()));
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b)) != -1) {
response.getOutputStream().write(b, 0, len);
}
response.flushBuffer();
fis.close();
}
public static ResultDto message(MaterialDto dto, HttpServletResponse response, HttpServletRequest request) {
try {
download(dto.getUrl(), dto.getName(), request, response);
} catch (Exception e) {
String mes = e.getMessage();
String message = mes.substring(mes.indexOf("(") + 1, mes.indexOf("。)"));
return ResultDto.Fail(message);
}
return ResultDto.Success("");
}
}
2、公共方法中的文件路径地址,必须配置成服务器存储文件的绝对路径,传入的url不作为路径地址使用,仅用来获取文件存储名及文件格式。
#资料库文件保存路径地址
file.path.address=/data/mng8888/webapps/upload/
File file = new File(ConstantUtil.getProperty("file.path.address") + substring);
3、进行功能测试。