因为项目部署在jboss上面,在上传一些图片的时候,把他上传到当前项目的下,比如:(这里是以Windows服务器为例的,当然linux也是一样的)
D:jboss-eap-6.4domainservers8080 mpvfs emptemp5e9f137492dc6baacontent-295f90957d15c1af
这个路径当你再次部署jboss的时候,他就会把后面红色标记的目录给重新生成一下且存在这些目录下的文件都会被删掉,所以当时想把图片利用:
String savePath = request.getSession().getServletContext().getRealPath("");
得到当前项目所在的物理磁盘路径,存储到其中的方法是不好实现的。之后有想到了在服务器上面部属个ftp,把图片什么都存储到ftp上面,然后把ftp的存储路径放到数据库中,这个方法是可行的,但是有的时候ftp服务器跟程序的应用服务器是分开的,所以当ftp服务器当机的时候,图片就存储不到了。然后就想到了把图片存储到jboss的根目录下的某个文件夹下,
String tempPath = System.getProperty("user.dir");
当成一个中转站,如果重新部署了war包,使得图片没有了,再从中转的目录中复制过来,主要的代码如下:
String saveName = dto.getDiplomatIdentity(); //从数据库中得到存储的相对路径 String tempPath = System.getProperty("user.dir"); String savePath = request.getSession().getServletContext().getRealPath(""); //中转站路径中的文件 File tempPathFile = new File(tempPath + "\" + saveName); //项目的相对路径(目录) File savePathFile = new File(savePath + "\resources\acs_imgs\shipper\"); //如果当前项目对于的相对路径下没有对应的图片。就从中转目录下拷贝一份,有的话就跳过此方法 // 如果中转目录下都没有文件,那么直接跳过。 File imgFile = new File(savePath + "\" + saveName); if (!imgFile.exists()) { if (tempPathFile.exists()) { //当前项目的相对路径没有对应的目录,新建 if (!savePathFile.exists()) { savePathFile.mkdirs(); } //得到中转目录的 文件流 FileInputStream fis = new FileInputStream(tempPath + "\" + saveName); //输出到 当前目录下 FileOutputStream fos = new FileOutputStream(savePath + "\" + saveName); int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } fis.close(); fos.close(); } }
当然File文件的操作,有个File#renameTo(File)方法,这个方法也是可行的,但是有的时候,他会出现小小的问题即:
不同盘符的分区格式不同,之间互相用File#renameTo(File)方法的时候,有可能会不成功的,具体看 http://xiaoych.iteye.com/blog/149328 和 http://www.iteye.com/topic/149328