SpringMVC跨域上传图片出现的405错误及409错误解决方式

  • Post author:
  • Post category:其他


第一步,创建两个web项目,创建项目如下所示:

其中在这里插入图片描述
其中fileupload_server用作图片服务器使用,day1021_springmvc用作上传图片的web项目使用。

第二步,分别将两个项目发布两个tomcat服务器上,注意,此刻我们所模拟的是在一台电脑上进行跨服务器上传图片操作的。

在这里插入图片描述

将fileupload_server部署到tomcat-9.0.36服务器上,注意修改端口。然后将day1021_springmvc部署到tomcat-8.5.43服务器上。

在这里插入图片描述

然后点击Apply–>OK,这样就部署完毕了。

第三步,编码时刻就到了。首先是fileupload_server图片服务器编码:

其架构是这样的:

在这里插入图片描述

我们只是默认在Idea中创建了一个使用maven构建的web项目,然后在webapp目录下创建了uploads文件夹,其中index.jsp页面代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>图片服务器</title>
</head>
<body>
        <h2>Hello springmvc跨服务器上传图片</h2>
</body>
</html>

只是作为一个简单的提示页面罢了。

接下来是day1021_springmvc的编码过程,同样是一个maven构建的web项目。

第一步:编写一个文件上传的页面,其代码如下所示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <%--springmvc跨服务器上传文件--%>
    <h3>springmvc跨服务器上传文件</h3>
    <form action="user/fileupload_twoServer" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload"><br/>
        <input type="submit" value="上传文件">
    </form>
</body>
</html>

然后编写相应的controller类,其代码如下所示:

package com.wangchao.day1024.returnValue.controller;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

@Controller
@RequestMapping("/day1024/user")
public class FileUpload {
    //springmvc跨服务器上传文件
    @RequestMapping(path = "/fileupload_twoServer")
    public String fileupload_twoServer(MultipartFile upload) throws IOException {
        System.out.println("springmvc跨服务器上传文件");
        //定义图片服务器请求路径
        String path = "http://localhost:9090/fileupload_server/uploads/";
        //获取到上传文件的名称
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        //把文件的名称唯一化
        filename = uuid+"_"+filename;
        //向图片服务器上传文件
        //创建客户端对象
        Client client = Client.create();
        System.out.println("client : "+client);
        //连接图片服务器
        WebResource resource = client.resource(path + filename);
        //上传文件
        resource.put(upload.getBytes());
        return "success";
    }
}

至于springmvc.xml配置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc.xsd
 http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd">
    <!--配置创建sprig容器要扫描的包-->
    <context:component-scan base-package="com.wangchao"></context:component-scan>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/day21/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--注册自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.wangchao.day1022.param1.converter.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>
    <!--前端控制器,哪些静态资源不拦截-->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

    <!--springmvc上传文件配置文件解析器,要求id必须是multipartResolver-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
    </bean>
    <!--开启spring对mvc注解的支持 ,如果没有数据转换器,可以不用加-->
    <!--<mvc:annotation-driven></mvc:annotation-driven>-->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
</beans>

web.xml配置如下所示:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
    <!--配置过滤器,处理中文乱码问题-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--指定字符集-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--配置SpringMVC的核心控制器-->
    <servlet>
        <servlet-name>springmvcDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置初始化参数-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:1021_springmvc.xml</param-value>
        </init-param>
        <!--配置servlet的对象的创建时间点:应用加载时创建。取值只能是非0正整数,
            表示启动顺序-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvcDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

代码部分完成,可以将项目发布到服务器了,首先将fileupload_server发布到tomcat-9.0.36服务器上。然后将day1021_springmvc发布到tomcat-8.5.43服务器上。结果我们发现当我们访问图片上传页面进行图片上传提交时,报了405错误,这是因为,我们是在同一电脑上使用的tomcat服务器,需要修改其中一个tomcat服务器中的配置文件,在config-web.xml文件中找到:

<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

然后在其中添加如下代码:


<!--当在同一台电脑中使用两个tomcat服务器时,配置如下设置可以避免报405错误--> <init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param>


然后在上传照片时,发现又会报出409错误,这是在fileuoload_server服务器上缺少一个uploads文件夹,所以需要在fileupload_server\target\fileupload_server文件夹下手动创建一个uploads文件夹,然后就可以成功上传图片了。

写在最后:任何成功都是靠一点一滴的坚持,最终就会攀上顶峰,大家加油!!!



版权声明:本文为taibaishenlong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。