最近遇到一个需求,通过系统配置的路径来完成一个下载功能,这个系统配置路径可能是hdfs路径也可能是部署服务器的路径,所以写了一个比较通用的方法,特此跟大家分享一下,也便于自己的记忆,主要是忘了还可以看一看,^_^直接上代码:
/**
*@Author huangzx
*@Description: 文件下载到客户端
*@Date 5:04 PM 2/23/19
*@Param [path, response]
*@return int
*/
public static int downloadFile(String path, HttpServletResponse response) {
int result = 1;
InputStream is = null;
OutputStream os = null;
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
try {
if (path.startsWith("hdfs://")) {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(path), conf);
is = fs.open(new Path(path));
} else {
File file = new File(path);
is = new FileInputStream(file);
}
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(path.substring(path.lastIndexOf("/")+1), "utf-8"));
os = response.getOutputStream();
byte[] b = new byte[2048];
int length;
while ((length = is.read(b)) > 0) {
os.write(b, 0, length);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
result = 0;
}finally {
closeInputStream(is);
closeOutputStream(os);
}
return result;
}
//下面两个是关流的方法
private static void closeInputStream(InputStream is) {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void closeOutputStream(OutputStream os) {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}