This commit is contained in:
Redkale
2016-09-14 10:08:16 +08:00
parent a81c9f7d21
commit 04b5b361ad
2 changed files with 28 additions and 12 deletions

View File

@@ -62,7 +62,7 @@ public final class HttpResourceServlet extends HttpServlet {
files.remove(uri);
} else if (event.kind() == ENTRY_MODIFY) {
FileEntry en = files.get(uri);
if (en != null) {
if (en != null && en.file != null) {
long d; //等待update file完毕
for (;;) {
d = en.file.lastModified();
@@ -205,7 +205,9 @@ public final class HttpResourceServlet extends HttpServlet {
if (finest) logger.log(Level.FINEST, "Not found resource (404), request = " + request);
response.finish404();
} else {
response.finishFile(entry.file, entry.content);
//file = null 表示资源内容在内存而不是在File中
//file = null 时必须传 filename
response.finishFile(entry.file == null ? entry.filename : null, entry.file, entry.content);
}
}
@@ -228,19 +230,30 @@ public final class HttpResourceServlet extends HttpServlet {
protected static class FileEntry {
protected final File file;
protected final String filename;
private final HttpResourceServlet servlet;
protected final File file; //如果所有资源文件打包成zip文件则file=null
ByteBuffer content;
protected final HttpResourceServlet servlet;
protected ByteBuffer content;
public FileEntry(final HttpResourceServlet servlet, File file) {
this.servlet = servlet;
this.file = file;
this.filename = file.getName();
update();
}
public FileEntry(final HttpResourceServlet servlet, String filename, ByteBuffer content) {
this.servlet = servlet;
this.file = null;
this.filename = filename;
this.content = content;
}
public void update() {
if (this.file == null) return;
if (this.content != null) {
this.servlet.cachedLength.add(0L - this.content.remaining());
this.content = null;

View File

@@ -525,6 +525,8 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
/**
* 将指定文件句柄或文件内容按指定文件名输出若fileBody不为null则只输出fileBody内容
* file 与 fileBody 不能同时为空
* file 与 filename 也不能同时为空
*
* @param filename 输出文件名
* @param file 输出文件
@@ -533,19 +535,20 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
* @throws IOException IO异常
*/
protected void finishFile(final String filename, final File file, ByteBuffer fileBody) throws IOException {
if (file == null || !file.isFile() || !file.canRead()) {
if ((file == null || !file.isFile() || !file.canRead()) && fileBody == null) {
finish404();
return;
}
if (fileBody != null) fileBody = fileBody.duplicate().asReadOnlyBuffer();
final long length = file.length();
final long length = file == null ? fileBody.remaining() : file.length();
final String match = request.getHeader("If-None-Match");
if (match != null && (file.lastModified() + "-" + length).equals(match)) {
final String etag = (file == null ? 0L : file.lastModified()) + "-" + length;
if (match != null && etag.equals(match)) {
finish304();
return;
}
this.contentLength = fileBody == null ? file.length() : fileBody.remaining();
if (filename != null && !filename.isEmpty()) {
this.contentLength = length;
if (filename != null && !filename.isEmpty() && file != null) {
addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
}
this.contentType = MimeType.getByFilename(filename == null || filename.isEmpty() ? file.getName() : filename);
@@ -559,14 +562,14 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
int pos = range.indexOf('-');
start = pos == 0 ? 0 : Integer.parseInt(range.substring(0, pos));
long end = (pos == range.length() - 1) ? -1 : Long.parseLong(range.substring(pos + 1));
long clen = end > 0 ? (end - start + 1) : (file.length() - start);
long clen = end > 0 ? (end - start + 1) : (length - start);
this.status = 206;
addHeader("Accept-Ranges", "bytes");
addHeader("Content-Range", "bytes " + start + "-" + (end > 0 ? end : length - 1) + "/" + length);
this.contentLength = clen;
len = end > 0 ? clen : end;
}
this.addHeader("ETag", file.lastModified() + "-" + length);
this.addHeader("ETag", etag);
ByteBuffer hbuffer = createHeader();
hbuffer.flip();
if (fileBody == null) {