关于文件上传以及谷歌浏览器报错 Not allowed to load local resource 的解决方法

1、起因以及第一个方法(不可行)

最近在做一个博客系统,其中有一个功能是上传头像,起初用的是String tomcatPath =request.getSession().getServletContext().getRealPath("/upload");这个方法,这个方法上传到webapps下面项目目录(eclipse在wtpwebapps),创建了一个upload文件,但是每当更改java代码重新编译时这个文件夹就会消失,这个问题让我很头疼。

2、原因

找到原因如下:

当我们在开发过程中,是需要不断redeploy的,当你redeploy时你的IDE大概做了这些事情:

  1. 重新编译你写的代码,生成classs文件夹

  2.将你的项目部署到服务器(在此指tomcat)的webapps目录下,如果有与将要部署的项目同名的文件夹则会删除后再部署!!!

  3.重新启动tomcat或者热部署

  嗯.没错,你文件上传完之后文件的确实实在在的在磁盘里,但是当你又写其他模块,或者重启服务器时,那么你的DIE会redeploy,然后你的IDE会检测到webapps目录下已经有了这个文件夹,那么它会删除的它,然后再将最新编译的代码部署过去,简单的说呢,就是替换了~当然 "/项目/upload" 文件夹也被替换了,所以里面的东西都没了。

3、第二个方法(在谷歌上面不可行)

通过查询资料,查找到我们可以直接方法webapps文件夹下面,然后通过localhost:8080/upload/xxx.png就可以访问了,这样编译的时候就不会删除这个文件夹和里面的东西。我通过如下方法获得了webapps下的upload的目录:

//获取到tomcat位于系统的绝对磁盘路径,精确到项目下.此为:D:\apache-tomcat-8.0.36\wtpwebapps\JavaBlog\
String tomcatPath =request.getSession().getServletContext().getRealPath("/");
//此为:D:\apache-tomcat-8.0.36\wtpwebapps\JavaBlog
tomcatPath = tomcatPath.substring(0,tomcatPath.length()-1);
//此为:D:\apache-tomcat-8.0.36\wtpwebapps
tomcatPath = tomcatPath.substring(0,tomcatPath.lastIndexOf("\\"));
String realPath = tomcatPath+"\\upload\\";

本来一位一切都会顺利执行,但是很伤心,输入localhost:8080/upload/xxx.png就出现了谷歌浏览器报错 Not allowed to load local resource,后来查询资料说是因为谷歌浏览器禁止直接访问磁盘文件(估计是出于安全考虑,要不然的话通过浏览器就可以访问本地的东西确实有点危险)。这样的话就必须要解决这个无法访问本地资源的问题,所以呢。又开始收集资料。

4、解决Not allowed to load local resource的问题

修改server.xml文件如下:在host标签中添加

<Context path="/imgs" docBase="E:\apache-tomcat-9.0.16\wtpwebapps\upload" debug="0" reloadable="true"/>

其中docBase是真实的绝对路径,而/imgs是虚拟路径。这样我访问localhost:8080/upload/xxx.png就ok了,同时可以上传头像了,在我满心欢心的时候,以为欧克的时候,又出现了问题。我重启了一下tomcat,发现localhost:8080/upload/xxx.png报了一个404错误。偶买噶。

接着查资料,后来发现原来是因为我用的是eclipse,所以还需要修改eclipse的server.xml文件,每一次重启服务,都会通过eclipse的server.xml文件更新tomcat的server.xml文件,所以上次404是因为设置的被清除了,eclipse的server.xml文件一般在工作空间下的.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf,修改如下:

<Context path="/imgs" docBase="E:\apache-tomcat-9.0.16\wtpwebapps\upload" debug="0" reloadable="true"/>

这样一6猛如虎的操作后确实重启服务都可以正常了,以为世界安静了下来,但是当你关闭eclipse的时候会发现。还是太年轻!!!

你以为这样就可以顺利运行了吗?

在记事本中的server.xml文件被覆盖,原因在于eclipse中的server.xml文件未被修改

修改server.xml,一部分代码

  <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>

	  <Context path="/imgs" docBase="E:\apache-tomcat-9.0.16\wtpwebapps\upload" debug="0" reloadable="true"/>
      <Context docBase="JavaBlog" path="/JavaBlog" reloadable="true" source="org.eclipse.jst.jee.server:JavaBlog"/></Host>
    </Engine>
  </Service>
</Server>

世界终于安静了下来,可以去睡觉了!!!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值