一些项目中往往需要上传一些图片文件之类,一般不建议直接保存在数据库内,往往是讲图片等资源保存在服务器的某个文件夹下,传统做法是上传到部署目录下,通过相对路径进行访问。这样当我们系统需要进行升级,进行全量更新的时候,就需要我们先将静态资源拷贝出来,然后项目部署成功之后又复制进部署目录。为了以后软件版本升级的方便,这时就需要这些静态资源放置在服务器tomcat目录外面。解决方法一般有两种,第一种就是用action层去处理用户的访问请求,如通过数据流来读取图片等;另一种方式则是配置tomcat的虚拟路径,将虚拟路径映射到物理真实路径。
这里用一个案例测试一下两种方式,首先在d盘下创建一个image文件夹,里面放一些图片(如001.jpg),然后建立一个工程。先实现用虚拟路径访问图片的方式。
用虚拟路径访问图片
首先先去tomcat的conf下找到server.xml,修改一下相关配置:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- 设置图片虚拟路径 -->
<Context path="/img" docBase="D:\image" reloadable="true" />
这里path是虚拟路径,D:\image是我们刚才创建的真实物理路径,实际应用中我们就可以通过/img访问到磁盘中的图片。接着我们就可以测试一下这个页面。
showImg.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>i/o流读取图片</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<%--<script src="local/communication/static/jquery.min.js" charset="utf-8"></script>--%>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<div>
<img id="viewImg2" src="<%=basePath%>img/001.jpg" style="height:200px;width:200px;">
</div>
</body>
</html>
由于我使用的是idea,第一次实验发现无法访问到图片,经查后发现需要进行一些配置,即在服务器配置页面勾选上Deploy applications configured in Tomcat instance选项,重启tomcat即可正常访问。
通过数据流访问图片
这种方式我们要实现一个servlet来读取本地磁盘上的图片,如下:
ImageAction.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
public class ImageAction extends HttpServlet {
private static final long serialVersionUID = -1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//读取本地图片输入流
FileInputStream inputStream = new FileInputStream("D:/image/001.jpg");
int i = inputStream.available();
//byte数组用于存放图片字节数据
byte[] buff = new byte[i];
inputStream.read(buff);
//记得关闭输入流
inputStream.close();
//设置发送到客户端的响应内容类型
response.setHeader("Content-type", "image/png");
OutputStream out = response.getOutputStream();
out.write(buff);
//关闭响应输出流
out.close();
}
}
然后在web.xml中对其注册:
<servlet>
<servlet-name>imageUrl</servlet-name>
<servlet-class>servlet.ImageAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>imageUrl</servlet-name>
<url-pattern>/imgurl</url-pattern>
</servlet-mapping>
之后我们只需要将showImg的代码修改为:<img id="viewImg2" src="<%=basePath%>imgurl" style="height:200px;width:200px;">
即可
访问到图片。
本文参考:
https://www.cnblogs.com/magic101/p/7756402.html
https://blog.csdn.net/javahighness/article/details/47062411
https://blog.csdn.net/u012255097/article/details/77752234