Bootstrap

关于tomcat本地存贮图片和访问本地资源Not allowed to load local resource

    自己在做一个项目的时候遇到了一个业务问题,因为我们有一个功能需要进行图片展示,前台展示,后台存储和配置这个图片。因为项目要部署到客户的服务器上去,客户要求能省资源就省资源,所以我们连文件服务器都没有。这就造成了一个难题我把图片文件存储在项目当中去每次发包以前存的照片就没有了,为了解决这个问题我进行了如下操作

1这是我最开始存储图片到项目获取地址的方法

用下面这个方法去获取我想要存地址结果很不理想,每次获取的是target下的目录,(ps:我用的是idea 发布用的是exploded包,不知道和这个有关系没)D:\workCode\文件名\项目文件名\target\项目名

fileName = request.getSession().getServletContext().getRealPath("/");//获取项目地址

后来我看了这个博客图片保存到Tomcat的webapps目录保存方法有用,展示我没用到但是试了一下没成功,感觉是我自身问题没理解博主的代码

话不多说直接上代码,图片保存在Tomcatwebapps目录下代码如下 (亲测方法有效)

public static String uploadFile(MultipartFile file) throws IllegalStateException, IOException {
        if(file!=null){
            //获取上传文件的原始名称
            String originalFilename = file.getOriginalFilename();
            String newFileName ="";
            String pic_path;
            // 上传图片
            if ( originalFilename != null && originalFilename.length() > 0) {
                //获取Tomcat服务器所在的路径
                String tomcat_path = System.getProperty( "user.dir" );
                System.out.println(tomcat_path);
                //获取Tomcat服务器所在路径的最后一个文件目录
                String bin_path = tomcat_path.substring(tomcat_path.lastIndexOf("\\")+1,tomcat_path.length());
                System.out.println(bin_path);
                //若最后一个文件目录为bin目录,则服务器为手动启动
                if(("bin").equals(bin_path)){//手动启动Tomcat时获取路径为:D:\Software\Tomcat-8.5\bin
                    //获取保存上传图片的文件路径
                    pic_path = tomcat_path.substring(0,System.getProperty( "user.dir" ).lastIndexOf("\\")) +"\\webapps"+"\\pic_file\\";
                }else{//服务中自启动Tomcat时获取路径为:D:\Software\Tomcat-8.5
                    pic_path = tomcat_path+"\\webapps"+"\\pic_file\\";
                }
                // 新的图片名称
                newFileName =UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));//可以自己写重新生成名字的方法,我没看懂就没用他的
                System.out.println("上传图片的路径:" + pic_path + newFileName);
                // 新图片
                File newFile = new File(pic_path + newFileName);
                // 将内存中的数据写入磁盘
                file.transferTo(newFile);//这个方法我也没有用,如果自己有工具类可以使用自己的
            }
            return newFileName;
        }else{
            return null;
        }
    }

 

2图片已经存在tomcat下webapp下pic_file中了那我们该如何访问它呢?

我当时想直接路径访问比如这样D:\apache-tomcat-8.0.52\webapps\pic_file\1236485.jpg

这时候会有问题,使用谷歌浏览器访问本地资源时浏览器会报Not allowed to load local resource

后来查询得知谷歌浏览器为保护安全不允许直接访问本地资源,然后我就要解决这问题进行访问这个资源有两个解决方案

方法一:更改tomcat的server.xml文件就行虚拟地址映射,就能访问到该资源。(对于我来说这并不能解决问题,因为我数据库存贮着我图片的地址,所以看上边那个tomcat地址,每个人的tomcat版本号名不一样导致文件名也不一样,可以都改成tomcat,但是去给客户部署的时候还要有这种步骤肯定很麻烦,到时候部署的人员不知道又会有麻烦,所以不推荐这种方法

方法二:方法一其实是我们陷入了一个误区的一个想法,这个误区也是我看到別的博客才发觉出来,我当初在想应该有很多人也遇到过我这样的问题把图片存入本地然后展示出来,但是在网上搜索资源很匮乏。后来发现是我思想出现了问题,也是我经验不足吧,这个给我了些启发怎么访问本地图片/资源我们可以像访问文件服务器一样进行资源访问啊,比如http://localhost:8080/pic_file/1236485.jpg。这样就能直接访问我们的资源并且下次发的包就不会把原来的图片丢失。

好了问题已经解决了,希望能帮助到你。编程之路学无止境;

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;