diff --git a/src/org/redkale/net/http/HttpResourceServlet.java b/src/org/redkale/net/http/HttpResourceServlet.java index df0713c5d..e7e107670 100644 --- a/src/org/redkale/net/http/HttpResourceServlet.java +++ b/src/org/redkale/net/http/HttpResourceServlet.java @@ -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; diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index f3df3f38f..d3d4c0a66 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -525,6 +525,8 @@ public class HttpResponse extends Response { /** * 将指定文件句柄或文件内容按指定文件名输出,若fileBody不为null则只输出fileBody内容 + * file 与 fileBody 不能同时为空 + * file 与 filename 也不能同时为空 * * @param filename 输出文件名 * @param file 输出文件 @@ -533,19 +535,20 @@ public class HttpResponse extends Response { * @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 { 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) {