下载文件的几种方法:
private void writeFileBuffer(String fileName, HttpServletRequest request, HttpServletResponse response, String contentType, String exportName) {
if (fileName == null) {
return;
}
File file = new File(fileName);
// ISO-8859-1 ==> UTF-8 进行编码转换
extractPathFromPattern(request);
// 其余处理略
if (file.exists()) {
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
OutputStream outputStream = response.getOutputStream();
) {
// 设置强制下载不打开
response.setContentType(contentType);
String name = StringUtils.isEmpty(exportName) ? file.getName() : exportName;
response.addHeader("Content-Disposition", "attachment;fileName=" + new String(name.getBytes("UTF-8"), "iso-8859-1"));
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
response.flushBuffer();
} catch (Exception e) {
log.info("文件下载失败" + e.getMessage());
}
} else {
log.info("文件下载失败-文件不存在,filename:" + exportPath + File.separator + fileName);
}
}
public void writeFileBuffer2(String fileName, HttpServletRequest request, HttpServletResponse response, String contentType, String exportName) {
try {
// path是指欲下载的文件的路径。
File file = new File(fileName);
// 取得文件名。
String filename = file.getName();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(fileName));
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");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void writeFileBuffer3(String fileName, HttpServletRequest request, HttpServletResponse response) {
try {
FileInputStream fileInputStream = new FileInputStream(fileName);//字节流
//设置文件下载方式
// response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes()));
;
//获取servlet响应输出字节流
// PrintWriter writer = response.getWriter();//字符流
ServletOutputStream outputStream = response.getOutputStream(); //字节流
//流数据交换,每次交换10k数据大小 (1024k = 1m)
byte[] bytes = new byte[1024 * 1000];
int read;
do {
read = fileInputStream.read(bytes);
outputStream.write(bytes, 0, read);
} while (-1 != read);
//关闭资源
IOUtils.closeQuietly(fileInputStream);
IOUtils.closeQuietly(outputStream);
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
}
public HttpServletResponse download(String path, HttpServletResponse response) {
try {
// response.reset();
// 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的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");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException e) {
String simplename = e.getClass().getSimpleName();
if("ClientAbortException".equals(simplename)){
System.out.println("客户端刷新太快了");
}else
e.printStackTrace();
}
return response;
}
public void down1(String path,HttpServletResponse response) throws Exception {
// response.reset();
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader(
"Content-disposition",
"attachment; filename=test.png");
try(
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(path)));
// 输出流
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
){
byte[] buff = new byte[1024];
int len = 0;
while ((len = bis.read(buff)) > 0) {
bos.write(buff, 0, len);
}
}
}