一、背景
之前有使用过Java使用hdfs相关API下载文件,但前后端交互有时会会没办法使用,本次需求是将HDFS文件使用流的形式下载下来。
二、代码
/**
* @param path 文件路径
* @param fileName 文件名
* @param response 响应头
*/
public void downloadHdfsFile(String path,String fileName, HttpServletResponse response) {
// 查询HDFS
Configuration config = new Configuration();
config.set("fs.default.name", hdfsAddress);
// 文件路径和名称拼接
String remoteFilePath = path "/" + fileName;
Path sourceFilePath = new Path(remoteFilePath);
FileSystem fs;
try {
// 远程地址
fs = FileSystem.get(new URI(remoteFilePath), config, "root");
boolean isExists = fs.exists(sourceFilePath);
// 文件存在则直接下载
if (isExists) {
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
response.setHeader("Last-Modified", new Date().toString());
response.setHeader("ETag", String.valueOf(System.currentTimeMillis()));
// 获取流
InputStream in = fs.open(sourceFilePath);
ServletOutputStream out = response.getOutputStream();
int b = 0;
byte[] buffer = new byte[1024 * 1024];
while (b != -1) {
b = in.read(buffer);
// 写到输出流(out)中
out.write(buffer, 0, b);
}
in.close();
out.close();
out.flush();
} else {
// 文件不存在,其他处理
......
}
} catch (Exception e) {
e.printStackTrace();
}
}