@RequestMapping("/file/get")
public void download(@RequestHeader(value = "origin", defaultValue = "") String origin, @RequestHeader(value = "User-Agent", defaultValue = "") String userAgent, @RequestHeader(value = "Range", defaultValue = "") String range, @RequestParam(value = "filePath", defaultValue = "") String filePath, HttpServletResponse resp) {
if (StringUtils.isEmpty(filePath)) {
WebUtils.sendError(resp, HttpStatus.BAD_REQUEST_400, "Parameter - `filePath` missing");
return;
}
log.info("range:{} , user-agent:{}", range, userAgent);
String fileName = new File(fileKey.trim()).getName();
if (!StringUtils.isEmpty(fileName)) {
resp.addHeader("Content-Disposition", String.format("inline; filename=\"%s\"", fileName));
Optional<MediaType> optionalMediaType = MediaTypeFactory.getMediaType(fileName);
optionalMediaType.ifPresent(mediaType -> resp.addHeader(HttpHeader.CONTENT_TYPE.asString(), mediaType.toString()));
}
String rule = WebUtils.getMatchAllowRule(origin, GlobalVar.getInstance().getAllowRules());
if (null != rule) {
resp.addHeader("Access-Control-Allow-Origin", rule);
resp.addHeader("Access-Control-Allow-Methods", "GET, POST");
resp.addHeader("Access-Control-Allow-Credentials", "false");
resp.addHeader("Access-Control-Allow-Headers", "X-Custom-Header");
}
shardFile(range, resp);
}
private void shardFile(String rangeStr,String filePath, HttpServletResponse response) {
long offset = 0L;
long length = 102400L;
File file = new File(filePath);
long totalSize = file.length();
if (StringUtils.isNotEmpty(rangeStr)) {
offset = Long.valueOf(rangeStr.replace("bytes=", "").split("-")[0]);
if (offset < 0 || offset >= totalSize) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
if (length <= 0 || offset + length > totalSize) {
length = totalSize - offset;
}
}
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
response.addHeader("Content-Length", String.valueOf(length));
response.setHeader("Accept-Ranges", "bytes");
String newRangStr = new StringBuffer("bytes ").append(offset).append("-").append((offset + length - 1)).append("/").append(totalSize).toString();
ponse.setHeader("Content-Range", newRangStr);
try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {
is.skip(offset);
byte[] buffer = new byte[10240];
int readSize = buffer.length;
int sumSize = 0;
while (true) {
if (readSize <= 0) {
break;
}
readSize = is.read(buffer, 0, readSize);
try {
response.getOutputStream().write(buffer, 0, readSize);
} catch (IOException e) {
}
sumSize += readSize;
if (sumSize + readSize > length) {
readSize = (int) (length - sumSize);
} else if (sumSize >= length) {
break;
}
}
} catch (Exception e) {
log.warn("写入失败", e);
}
}