摘要: java读取服务器文件,传输给客户端代码。
java读取服务器文件,传输给客户端代码。
public static void download(String path, HttpServletResponse res,
HttpServletRequest req,String fileOldName) {
BufferedOutputStream bos = null;
RandomAccessFile oSavedFile = null;
try {
if(StringUtil.isEmpty(path)){
res.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
File file = new File(path);
if (file.exists()) {
String range = req.getHeader("Range");
String fileName = file.getName();
long fileLength = file.length();
long fileStart = 0;
long fileEnd = fileLength - 1;
String lastModified=String.valueOf(file.lastModified());
String ifModifiedSince=req.getHeader("If-Modified-Since");
//判断资源是否修改,允许读取缓存
if(lastModified!=null&&lastModified.equals(ifModifiedSince)){
//304
res.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
// 头消息读取
if (range != null && range.indexOf("=") > 0) {
fileStart = Long.parseLong(range.substring(
range.indexOf("=") + 1, range.indexOf("-")).trim());
if (range.indexOf("-") + 1 < range.length()) {
fileEnd = Long.parseLong(range.substring(
range.indexOf("-") + 1).trim());
}
}
long contentLenth = fileEnd - fileStart + 1;
res.reset();
//设置文件Content-Type(Mime-Type),此处为通用
res.setContentType("application/octet-stream");
res.addHeader("Connection", "keep-alive");
//允许部分下载
res.addHeader("Accept-Ranges", "bytes");
//允许浏览器缓存
res.addHeader("Last-Modified",lastModified);
//设置名称,此处判断是否需要改名为原名
res.addHeader("Content-disposition", "attachment;filename=\""
+ (fileOldName==null?fileName:fileOldName )+ "\"");
//判断是否只需部分,允许部分下载
if (!StringUtils.isEmpty(range)) {
res.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
}
//请求的内容长度
res.addHeader("Content-length", contentLenth + "");
//在整个返回体中本部分的字节位置
res.addHeader("Content-Range", "bytes " + fileStart + "-"
+ fileEnd + "/" + fileLength);
OutputStream ops = res.getOutputStream();
byte[] buffer = new byte[8 * 1024];
bos = new BufferedOutputStream(ops);
oSavedFile = new RandomAccessFile(file, "r");
oSavedFile.seek(fileStart);
while ( oSavedFile.read(buffer) != -1) {
bos.write(buffer);
//从总长度中减去已读取长度
contentLenth -= buffer.length;
//判读剩余长度是否满足byte[]长度
if (contentLenth <= buffer.length) {
//若读完就结束
if (contentLenth <= 0) {
break;
}
//读取剩余长度后结束
buffer = new byte[(int) contentLenth];
oSavedFile.read(buffer);
bos.write(buffer);
break;
}
}
}else{
res.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (oSavedFile != null) {
oSavedFile.close();
}
if (bos != null) {
bos.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
};
© 著作权归作者所有