【问题标题】:Access files outside the Webcontent folder访问 Webcontent 文件夹之外的文件
【发布时间】:2015-07-01 02:58:05
【问题描述】:

我在网页内容之外创建了一个文件夹来保存用户上传的图片。最初我尝试通过在“src”标签中传递位置来直接访问这些文件,但无法获取它。经过研究,我发现我必须在标签内的“conf/server.xml”文件中设置路径。虽然我做了所有这些更改,但我无法访问该文件。

1)我的 Tomcat 安装在 E:\my work\Tomcat

2)我的 webroot 位于 E:\my work\Project

3)图片文件夹位于E:\my work\images

我在“conf\server.xml”中设置的路径是

    <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
   <Context docBase="/my work/images/" path="/images"  />
   </Host>

但是当我尝试使用以下 url 访问文件时

           http://localhost:8080/images/paper.jpg

我无法获取它并收到“HTTP 状态 404”和未找到请求资源错误。

请帮助我,当用户请求特定图像时,我正在使用 Blob 字段存储图像并将图像存储在此文件夹中。我不想使用特定的 servlet 将图像写入浏览器,而是希望直接访问用户。

请帮我解决这个问题。 谢谢 关注

【问题讨论】:

    标签: java jsp tomcat servlets


    【解决方案1】:

    &lt;context&gt; 添加到tomcat/conf/server.xml 文件中。

    <Context docBase="c:\images" path="/project/images" />
    

    这样,你应该可以找到以下文件(例如c:/images/NameOfImage.jpg):

    http://localhost:8080/project/images/NameOfImage.jpg

    【讨论】:

      【解决方案2】:

      解决方案是编写一个 Servlet,它将从外部文件夹读取文件并将它们流式传输到客户端:本质上,它充当客户端和外部文件系统之间的代理。这需要类似下面的内容,您可以简单地使用:

      <img src="/pathToMyImageServlet?imageId=123"/>
      

      小服务程序:

      public class ImageServlet extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
              String imageId = request.getParameter("imageId");
      
              /*
              File file = new File("E:/my work/images/" + imageId);
              FileInputStream in = new FileInputStream(file);
              OutputStream out = response.getOutputStream();
      
              byte[] buf = new byte[1024];
              int count = 0;
      
              while ((count = in.read(buf)) >= 0) {
                  out.write(buf, 0, count);
              }
              */
      
              byte[] imageData = ....// data from db for specified imageId
              OutputStream out = response.getOutputStream();
              out.write(imageData);
              out.flush();
              out.close();
              //in.close();
      
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doGet(request, response);
          }
      }
      

      【讨论】:

      • 我不想使用 servlet,因为我正在处理数据库中的图像,而用户请求它并将其存储在我想带到外面的 web 内容中。如果我将使用另一个 servlet 再次处理它并使其可用于浏览器,那么在运行时效率方面这将是一个好方法吗?
      • 那你不能用这个Servlet直接从数据库流式传输吗?你为什么要在磁盘上创建映像?
      • 感谢您的建议,我会尝试一下。
      • 您需要做的就是将字节从数据库写入输出流 out.write(bytesFromDatabase);查看更新。
      • 是的,我明白了基本的想法,如果需要帮助,我正在编写代码,我会再次联系。感谢您的回复。
      【解决方案3】:

      据我了解,您的项目应该在 tomcat webapps 文件夹中,并且图像应该像

      webapps/YourProject/resources/images/something.jpg
      

      webapps/YourProject/WEB-Content/images/something.jpg
      

      根据我的经验,我认为您不必在任何 xml 中设置路径。只需直接访问图像,您就可以访问它。该容器限制对放置在 WEB-INF 文件夹中的任何内容的访问。

      【讨论】:

      • 没有它在我上面提到的层次结构中 E:\my work\Project\WebContent
      • 这就是您需要更改层次结构的内容。您是否将 Web 项目保存在 Tomcat 的 webapps 文件夹中?你在使用任何 IDE 吗?您在 localhost:8080 之后提供了图像 url localhost:8080/images/paper.jpg,您的项目名称应该在那里。您已直接指定图像文件夹。这不是从您的 web 应用访问资源的标准方式。
      • 是的,我正在使用 Eclipse IDE。我也经历了this question的回答,然后我实现了这个。
      • 它们不能存储在 webapps 文件夹中,因为这些是用户上传的图像,下次部署时会丢失。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2012-12-11
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多