web项目中访问用户图片的两种方式—数据流与虚拟路径(包括IDEA配置的小问题)

一些项目中往往需要上传一些图片文件之类,一般不建议直接保存在数据库内,往往是讲图片等资源保存在服务器的某个文件夹下,传统做法是上传到部署目录下,通过相对路径进行访问。这样当我们系统需要进行升级,进行全量更新的时候,就需要我们先将静态资源拷贝出来,然后项目部署成功之后又复制进部署目录。为了以后软件版本升级的方便,这时就需要这些静态资源放置在服务器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 &quot;%r&quot; %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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值