这是一个标准的(可能是微不足道的)情况,但我找不到关于这个主题的详细信息。
假设我们有一个web应用程序A (http://my-webapp)和一个文件服务器F (http://file-server)。
为清楚起见:
在A中显示存储在F上的图片的最佳实践是什么
假设客户端发出一个请求http://my-webapp/pictures/123,其中123 -任意id指向存储为http://file-server/storage/xxx123.jpg的图片,并期望在浏览器中看到图片。
发布于 2019-06-12 13:44:18
我提出以下解决方案作为一个最低限度的例子,这可能是一个很好的起点。
.htaccess的重定向似乎是在低层次上做类似的事情。
实际上,这个问题应该由web应用服务器自己来解决,而不需要外部工具(比如Apache或Nginx)的干预。
1.在web.xml中声明servlet
<servlet>
<servlet-name>pictures</servlet-name>
<servlet-class>myapplication.servlets.HiddenFileServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pictures</servlet-name>
<url-pattern>/pictures/*</url-pattern>
</servlet-mapping>2.实现servlet
public class HiddenFileServlet extends HttpServlet
{
@Inject
MyService myService; // a service for paths finding on http://file-server
@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws IOException
{
String requestedUri = req.getRequestURI();
String fileName = myService.getFileName( requestedUri );
String mime = getServletContext().getMimeType( fileName );
if ( mime == null )
{
resp.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
return;
}
else
{
resp.setContentType( mime );
}
// path on http://file-server/storage
URL fileFullPath = myService.getInternalPath( requestedUri );
URL file = new URL( fileFullPath );
try (
InputStream in = file.openStream();
OutputStream out = resp.getOutputStream()
)
{
org.apache.commons.compress.utils.IOUtils.copy( in, out );
}
}
}发布于 2019-06-11 12:10:26
“最佳实践”涵盖了很多方面。
出于负载和性能的原因,最好使用web服务器(如NGINX或Apache)而不是应用服务器来提供静态资产。大多数生产环境都有此设置,必要时使用web服务器向应用程序服务器代理请求。
如果有这样的设置,可以将F上的映像驱动器映射为web服务器上的驱动器,并使用.htaccess重写规则来处理文件名逻辑。
如果由于无法在regex或类似的文件中捕获文件名逻辑,则可以在A上编写servlet,以便向“常规”web位置发出重定向。与…有关的东西:
http://my-webapp/pictures/123我强烈建议您不要使用servlet从F读取文件,然后将其流到浏览器;这会消耗应用程序服务器上的大量内存,并且可能会根据本地网络条件而减慢甚至失败。在负载下,应用程序的性能几乎肯定会很快下降。
https://stackoverflow.com/questions/56542828
复制相似问题