栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Java Web应用程序中从应用程序服务器外部提供静态数据的最简单方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java Web应用程序中从应用程序服务器外部提供静态数据的最简单方法

我已经看到了一些建议,例如将图像目录作为指向Web容器外部目录的符号链接,但是这种方法在Windows和* nix环境下都可以使用吗?

如果您遵循*
nix文件系统路径规则(即,您仅使用中的正斜杠

/path/to/files
),那么它也将在Windows上运行,而无需摆弄丑陋的
File.separator
字符串连接。但是,只能在与调用该命令的位置相同的工作磁盘上对其进行扫描。因此,例如如果安装了Tomcat,
C:
/path/to/files
实际指向
C:pathtofiles

如果这些文件都位于webapp之外,并且您想让Tomcat

DefaultServlet
处理这些文件,那么在Tomcat中,您基本上要做的就是将以下Context元素添加到
/conf/server.xml
inside
<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()

希望这可以帮助。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405999.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号