关于上传图片中服务器的地址的问题

最近在做一个服装网站的项目,用的是Eclipse,Svn,其中有一个增加功能,要上传图片都服务器上,
于是在写目标地址的是很出现了一些问题:
[code="java"]
//产生一个日期加五位随机数的文件名
SimpleDateFormat gs = new SimpleDateFormat("yyyyMMddHHmmss");
String time = gs.format(new Date());
String imageFileName = time + getRandom() + getExtention(fileName);
//获取项目名
String sp = ServletActionContext.getRequest().getContextPath();
String spath = sp.substring(1, sp.length());
// 获取目标地址
String[] str = ServletActionContext.getServletContext().getRealPath("/").split(".metadata");
//UploadImage是规定图片上传到服务器的文件夹
File imageFile = new File(str[0] + spath + "\Webroot\UploadImages\"+ imageFileName);

[/code]
,但数据库中地址那个字段显示的是:E:\Workspace\ctcs11\Webroot\UploadImages\2009081915322682855.jpg,我的项目Workspace在E盘,我想当用户通过浏览器访问的是他本地的E:\Workspace\ctcs11\Webroot\UploadImages\2009081915322682855.jpg,肯定是找不到的,有什么可以改正的。
还有我们组的workspace都不统一,所以数据库中的地址也是乱七八糟的有D盘的,有E盘的,
1.想问下是不是目的地址方法有误
2.ServletActionContext.getServletContext().getRealPath("/").split(".metadata");为什么取值是E:\Workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ctcs11
[b]问题补充:[/b]

重新调试了下
System.out.println(ServletActionContext.getServletContext().getRealPath("/"));
System.out.println(ServletActionContext.getServletContext().getRealPath(""));
结果显示为:
E:\Workspace.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\ctcs11\
E:\Workspace.metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\ctcs11
[b]问题补充:[/b]
lovewhzlq:因为是SVN版本控制的,是在Eclipse中check out出来做的 映射到我本地上就是E:\Workspace\ctcs11

saiyaren :能不能具体讲一下,什么东西大家不需要看到,用户是通过action从数据库中取图片的值,然后显示在页面上的,这样数据库中地址是E:\Workspace\ctcs11\Webroot\UploadImages\2009081915322682855.jpg,不是有问题吗
[b]问题补充:[/b]
xman :我现在的问题是在数据库写的地址是本地的一个绝对地址,,如果每个客户上传时都上传本地的一个绝对地址,那其他客户到数据库取值的时候不是取不到吗
[b]问题补充:[/b]
lovewhzlq :那我这边代码应该怎么写能不能详细说一下?
saiyaren:上传到指定的文件夹后,取图片时,由于许多图片都放在一起,由于我要对图片显示进行一个选择,比方说选择state为0的图片,所以我还是通过action访问数据库,然后将从数据库取到的集合放到session中,然后在页面
img src="${}"调用,所以取值时不会绕过数据库的
[b]问题补充:[/b]
补充一下:用SVN将项目check out出来以后,那么我用getRealPath时虽然取得是服务器地址,但服务器映射在本地,所以取得是E:\Workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ctcs11
这种地址

如果项目部署好后,是 不是用户访问时,getRealPath()地址就会变成
http://XXX:8080/.......这样的格式
[b]问题补充:[/b]
现在的问题是我对getRealPath这个方法返回的值不清楚
E:\Workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\ctcs11 或http://XXX:8080/.......这样的格式哪一种
[b]问题补充:[/b]
lovewhzlq :不知道我这样理解对不对:由于getRealPath()返回服务器端的物理地址,当我们用SVN check out到本地做的,本地既是服务器端又是客户端,当我们访问时采用http://localhost:8088/项目名运行时,由于都是访问的各自的本地服务器物理路径(也就是服务器映射到本地的地址),所以会出现
E:,D:这样的字样,如果部署好以后,用户访问时,getRealPath()返回的服务器地址就是一个统一的物理地址。不知道理解得对不对

理解是对的,这api就是这样

ServletActionContext.getServletContext().getRealPath("")这样才是得到项目的根目录地址

你的应用的路径是在哪的

你们最后应该是应用到服务器中吧,开发时不必每个人都看到,只需要最后可以看到就行,直接=request.getRealPath("/")+路径+"//"

你似乎还没搞清楚服务器端,客户端的区别吧?
图片上传到服务器端后,跟用户所在的客户端一点关系都没有了。
客户端浏览器显示的图片路径将是http://www.xxx.com/uploadimg/xxx.gif 这样的路径。

我们也是用svn做版本控制的,但是你们最后的系统给用户应该是放在一台服务器给用户用的,所以你们可以这样做,我平时是这样做的,数据库里面记录上上传文件的名称,然后在你的project下新建一个文件夹,这个文件夹专门是用来存放图片的,比如这个文件夹叫upload,如果你在页面中想要调用这个图片的话,就可以这样

这样你不就可以找到你的图片了嘛,但是这应该只是在你本机上的是吧,那么无所谓,你可以上传后有个初使的,你放到文件夹中,通过svn上传上去后,别人一部署,可以通过数据库找到你的这个文件不就可以了嘛,这样是最灵活的方法,你像你要找E盘,那如果电脑中没有E盘的呢?那不就虾米了?是不是?呵呵!

如果还有问题可以再问我,我对上传这块还是比较熟的,因为这几天又做了个模块中更换标签图片这个操作,这个应该是不困难的,不要想的太复杂!!!

这个也太土了吧
你只管上传,比如到webapp/ROOT/images即可
显示就由tomcat or apache去做吧

不是,怎么会在数据库中保存一个本地的路径呢,应该把图片放到服务端的web目录的某个目录,在数据库中保存相对web根目录的路径就行了

你只需要存名字就可以了!不用把绝对路径都存进去!上传后放到你的project下然后取的时候从你的文件夹中按名字取就可以了!
[quote]这个也太土了吧
你只管上传,比如到webapp/ROOT/images即可
显示就由tomcat or apache去做吧[/quote]
你说的不是和我说的一样嘛,还土?那你不是也一样土吗?我说的你看懂没有?服务器指什么?真是晕死!!!!!

我是说发布者,没说你,这么喜欢对号入座

取的时候当然需要数据库了,如果不用数据库我们就没必要存他的名字了是吧!!!
但是不明白你为什么要存到session中?能不用session就不要用它,直接request回去不是就可以了嘛,然后通过jstl取出来直接就可以显示了啊!!!

首先,用户通过浏览器访问图片是可以访问得到的,因为你没把图片的目录放在WEB-INF/下,因为这个目录下的文件用户是无法直接访问的.
团队开发保存图片最好取一个统一存放图片的地方,如F:\images\来保存图片,对这些数据最好拿个单独的磁盘出来保存,这个是要统一的,项目交给用户的话,把这此图片数据放到项目的目录下是不合理的.

在数据库存放的时候要存相对的地址,获取的时候也取得相对的地址即可.不用用绝对地址进行读取和存放.
OVER

指出楼主两个问题:
1,上传文件夹不正确,
[code="java"]File imageFile = new File(str[0] + spath + "\Webroot\UploadImages\"+ imageFileName);
[/code]
其中[code="java"]str[0] + spath + "\Webroot\UploadImages\"[/code]
应该是你本地eclipse工作空间的地址,无法应该于其它人的开发环境中,按你这种方式上传的文件会生成在你的工作空间中。而不一定是web运行的目录中.无法适用于服务器。
因此你直接使用如下代码即可:
[code="java"]
String webRootPath =ServletActionContext.getServletContext().getRealPath("/");
//UploadImage是规定图片上传到服务器的文件夹

File imageFile = new File(webRootPath +"UploadImages\"+ imageFileName);
....
[/code]

2,上传的文件服务器与客户端的关系没有理清,含糊不清!
简单了解方式,通过http://xxx:port/UploadImages/xxx.gif能访问到的一般在服务器Web应用目录上。如果出现楼主代码出现的WebRoot类的文件夹可能会有问题的!

存数据库直接存 imageFileName就行了

getRealPath得到的是物理路径,也就是E:\Workspace.metadata.。。。。这种方式的

朋友,这文章说得很好

http://fluagen.blog.51cto.com/146595/60732