我已经看到了一些建议,例如将图像目录作为指向Web容器外部目录的符号链接,但是这种方法在Windows和* nix环境下都可以使用吗?
如果您遵循*
nix文件系统路径规则(即,您仅使用中的正斜杠
/path/to/files),那么它也将在Windows上运行,而无需摆弄丑陋的
File.separator字符串连接。但是,只能在与调用该命令的位置相同的工作磁盘上对其进行扫描。因此,例如如果安装了Tomcat,
C:则
/path/to/files实际指向
C:pathtofiles。
如果这些文件都位于webapp之外,并且您想让Tomcat
DefaultServlet处理这些文件,那么在Tomcat中,您基本上要做的就是将以下Context元素添加到
/conf/server.xmlinside
<Host>标记中:
<Context docbase="/path/to/files" path="/files" />
这样,就可以通过访问它们
http://example.com/files/...。GlassFish /
Payara配置示例如果您想自己控制文件的读写,那么您需要为此创建一个
Servlet,它基本上只是
InputStream以例如的形式获取文件的
FileInputStream并将其写入的
OutputStream中
HttpServletResponse。
在响应上,您应该设置
Content-Type标题,以便客户端知道要与提供的文件关联的应用程序。并且,您应该设置
Content-Length标题,以便客户端可以计算下载进度,否则它将是未知的。并且,如果需要“ 另存为” 对话框,则应将
Content-Disposition标题设置为,否则客户端将尝试内联显示它。最后,只需将文件内容写入响应输出流即可。
attachment__
这是这种servlet的基本示例:
@WebServlet("/files/*")public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = URLDeprer.depre(request.getPathInfo().substring(1), "UTF-8"); File file = new File("/path/to/files", filename); response.setHeader("Content-Type", getServletContext().getMimeType(filename)); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "inline; filename="" + file.getName() + """); Files.copy(file.toPath(), response.getOutputStream()); }}url-pattern例如
/files/*,当映射到的时,您可以通过调用它
http://example.com/files/image.png。这样
DefaultServlet,与提供请求相比,您可以更好地控制请求,例如提供默认图像(即
if(!file.exists()) file = new File("/path/to/files","404.gif")左右)。另外,request.getPathInfo()最好使用上面的,
request.getParameter()因为它对SEO更为友好,否则IE在“
另存为” 期间将不会选择正确的文件名。
您可以重复使用相同的逻辑从数据库提供文件。只需替换
new FileInputStream()为
ResultSet#getInputStream()。
希望这可以帮助。



