springMVC跨服务器上传文件及注意事项

springMVC跨服务器上传文件及注意事项

1.导入开发需要的jar包

<properties>
    <project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

   <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    
   <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.18.1</version>
    </dependency>

  </dependencies>

1.1.其中跨服务所需要增加的jar为:

  <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.18.1</version>
    </dependency>

  1. 配置前端核心控制器和解决post请求中文乱码问题(需要注意的是springMVCget请求中文不乱码),classpath:springmvc.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>
<!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--配置解决中文乱码的过滤器-->
  <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>
</web-app>

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">
        
    <!-- 开启注解扫描 -->
    <context:component-scan base-package="cn"/>
    <!-- 视图解析器对象 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--配置文件解析器 id值是固定的,必须是这样值,否则出错-->
    <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--配置最大上传文件的大小-->
        <property name="maxUploadSize" value="10485760"></property>
    </bean>
    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven />
</beans>

3.前端界面,提交的是表单,提交的方式必须是post, enctype的必须是:“multipart/form-data”,而且需要注意的是,name的值必须与后台的 MultipartFile 的变量名一致即指定为“upload”就必须都为upload,稍后将在控制类的提现出来,注意留意观察

<form action="file/fileupload3" method="post" enctype="multipart/form-data">
    选择文件: <input type="file" name="upload"><br/>
    <input type="submit"        value="上传">
</form>

上传文件的控制类:这里还解决了上传是带中文的问题和文件重名问题

@Controller
@RequestMapping("/file")
public class fileUpload {
    /**
     * 跨服务器上传图片,MultipartFile的变量名 必须与表单传来的name值属性相同
     * @param upload
     * @return
     * @throws IOException
     */
 @RequestMapping("/fileupload3")
    public String fileupload3(MultipartFile upload) throws IOException {
        System.out.println("跨服务器的上传文件---");
        //定义服务器上传路径(如果没有uploads文件夹需要在另一个服务器中target目录(即编译好的目录)瞎下手动创建uploads文件夹
        String path = "http://localhost:9090/uploads/";
        //获取文件的名称
        String name = upload.getOriginalFilename();
        //对带有中文路径名称的图片进行编码
        String encodeName = URLEncoder.encode(name, "UTF-8");
        //调试带有中文名称的图片是否进行了编码
        System.out.println(encodeName);
        //防止文件名重名
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String fileName = encodeName+"_"+uuid;
        System.out.println(fileName);
        //创建客服端
        Client client = Client.create();
        //与图片服务器进行连接
        WebResource webReource = client.resource(path+fileName);
        //上传文件,
        webReource.put(upload.getBytes());
        return "success";
    }

另外需要再创建一个空的项目作为文件服务器,配置服务器时,端口号,必须与以上项目的端口号不一致,需要注意的是,项目部署的方式必须为war exploded方式,不是选择war方式,这两种方式的区别在于:
war: 上传的文件会存放在 Tomcat 所在的目录下
war exploded:​ 上传的文件会存放在当前目录下

所以部署这个空的项目时需要用war exploed这种方式

4.注意事项:

4.1 上传文件时时出现403错误:
解决办法:tomcat服务器默认是不可写操作,只允许读,所以在Tomcat web.xml文件中的servlet标签内加入readonly:false

<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>readonly</param-name>
        <param-value>false</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>

4.2 上传文件时出现409错误:
409路径错误,即当前访问的路径下没有相关文件。
解决办法:在文件存储服务器中的**target/**项目名的路径下,新建一个和你上传服务器路径一致的文件,这里是uploads文件。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值