由web项目中上传图片所引出的路径问题

时间:2024-01-10 18:33:56

我在做javaweb项目的时候,有个项目中需要进行图片的上传,有次我重新部署项目后,发现之前上传的图片不见了,最后找出原因:图片上传在服务器目录上,而不是绝对路径,所以特别想弄清楚javaweb项目中有关路径的一些问题。

首先,在做项目的时候我们最好用相对路径,如果写成绝对路径,当项目发布到其他环境时,绝对路径就错了。

Java中传统方式取资源时,有很多的方法;

先来看一看Class.getResource(String path),

path 不以'/'开头时,默认是从此类所在的包下取资源;

path  以'/'开头时,则是从ClassPath根下获取,在这里就是相当于项目的bin目录(Eclipse环境下);

注意:Class.getResourceClass.getResourceAsStream(获取资源流)在使用时,路径选择上是一样的。

再来看ClassLoader,即Class.getClassLoader().getResource(String path),

path不能以’/'开头, path是从ClassPath根下获取,在这里就是相当于项目的bin目录(Eclipse环境下);

注意:Class.getClassLoader().getResourceClass.getClassLoader().getResourceAsStream在使用时,路径选择上也是一样的。

-----------------------------------------------------------------------------------------------------------------------------

手动分割线

-----------------------------------------------------------------------------------------------------------------------------

注意哦,上面说的是传统方式获取资源的方法,也就是在一般的java项目中,那么在web项目中呢?

在web工程中,一般来说,是不能采用传统方式读取资源的,因为相对的是tomcat的bin目录,这也就是为什么图片上传在服务器目录上。

首先我们要先了解web中通过servletContext对象读取资源文件,然后就好理解web工程中,不同位置的资源文件的读取方式;

(在一个web工程中,只要涉及到写地址,建议最好以/开头)

第一点:使用ServletContext的getRealPath(String path)方法,获得文件的完整绝对路径path,再使用字节流读取path下的文件;

第二点:使用ServletContext的getResourceAsStream(String path)方法:返回资源文件的读取字节流;

第三点:使用ServletContext的getResource(String path)方法,获得一个url对象,调用该类的openStream方法返回一个字节流,读取数据;

第四点:还可以使用ServletContext的getResourcePaths(String Path)获取指定目录下所有资源路径;

好了,了解了ServletContext,现在就能用它在web项目中进行不同位置的资源文件的读取了,用例子来说明:

项目目录:

由web项目中上传图片所引出的路径问题

tomcat中的此项目目录:

miniblog目录:

由web项目中上传图片所引出的路径问题

WEB-INF目录:

由web项目中上传图片所引出的路径问题

classes目录:

由web项目中上传图片所引出的路径问题

读取jdbc.properties(当资源文件在包下面时),

InputStream in =this.getServletContext().getResourceAsStream("/WEB-INF/classes/jdbc.properties");

读取web.xml(资源文件在WEB-INF下),

InputStream in =this.getServletContext().getResourceAsStream("/WEB-INF/web.xml");

读取adminuser.jsp(资源文件在web工程中),

InputStream in =this.getServletContext().getResourceAsStream("/adminjsps/adminuser.jsp");

好了,这些就是我了解到的了~

注意:普通java项目和javaweb项目所对应的基本路径是不一样的,普通java项目对应的是eclipse工作空间的某个项目的bin目录,而javaweb项目则是tomcat的某个项目的根

目录;所以,取路径,取资源的方式都有所区别。