欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springmvc跨服务器上传文件

程序员文章站 2022-06-02 14:10:09
...

刚才作者做了一个测试,就是想方设法的将一个文件从本地上传到tomcat上,然后又由tomcat转发到另外一个服务器,由另外一个tomcat保存。但是报错了很多东西,不过作者还是一一解决了。现在将两个项目粘到这,说明文件跨服务器上传的原理。


说说作者想干的事情

springmvc跨服务器上传文件
如上图,在现在的企业中开发中,很多服务器是组合完成一个工作的。一个主服务器配置多个子服务器,每个子服务器专注一项工作,如上图,可能服务器B是用来处理数据分析的任务,服务器C用来对客户操作分析。对于一个多服务器的项目来说,客户端发送一个请求到服务器集群上,主服务器先取得客户端请求,然后根据客户端的请求调用子服务器的业务,或者直接给子服务器下达命令,让子服务器给主服务器回馈一个命令执行结果,比如说任务成功执行且完成了,反馈给主服务器一个success状态字,失败了返回一个failed状态字。
先说明服务器之间的套接关系,然后说明作者相干的事情,作者想由客户端上传一个文件,然后将文件的内容通过主服务器传递到服务器a上保存。就这么简单,跨服务器传递文件。


创建项目一springmvc_uploadFileSource(项目名可能不同,只不过那是作者的命名习惯而已,注重内容就好)

给出项目的目录结构如下所示:
springmvc跨服务器上传文件
给出pom.xml文件的坐标

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</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>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

给出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>

  <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>
</web-app>

给出控制器代码:

package com.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.net.URLEncoder;
import java.util.List;
import java.util.UUID;

@Controller
public class UploadFile {
    /**
     * springmvc跨服务器文件上传
     * @param upload 此名称必须与文件上传时所用的input输入框的name命名相同
     * @return 如果成功,返回到成功界面
     * @throws Exception
     */
    @RequestMapping("/uploadFile")
    public String testUploadFile(MultipartFile upload) throws Exception {
        System.out.println("upload file across service");
        // upload.getOriginalFilename()获取文件的原始名称
        String filename = UUID.randomUUID().toString().replace("-", "") + "-" + upload.getOriginalFilename();
        String encodeFileName = URLEncoder.encode(filename, "utf-8");// 若是不写这段代码,此处会产生一个bug
        System.out.println(filename);

        // 提供服务器路径
        String path = "http://localhost:8081/20201203_uploadfileTarget_war/uploads/";
        // 创建客户端
        Client client = Client.create();
        // 链接服务器
        WebResource webResource = client.resource(path + encodeFileName);
        // 上传文件
        webResource.put(upload.getBytes());
        return "success";
    }
}

给出web应用启动界面index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<a href="test">test</a>
<%--uploadFile1--%>
<h3>跨服务器文件上传</h3>
<form method="post" enctype="multipart/form-data" action="uploadFile3">
    <input type="file" name="upload"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

至于success.jsp文件随便写,没有什么意思,无非就是成功后的一个告知界面,此界面作者不在给出。

上述第一个项目的文件目录结构即重要代码全部给出,下面是第二个项目


第二个项目就是一个web空架子,无非就是在webapp下创建了一个uploads文件夹而已, 不过还是给出项目的目录结构。
springmvc跨服务器上传文件
target是部署到tomcat文件结构,这个项目是一个空项目,没有任何东西。


配置tomcat服务器

作者为了避免一个tomcat服务器无法区分问题,配置了两个服务器,分别是tomcat8和tomcat9。
给出tomcat配置文件中default项下的readonly解释:
springmvc跨服务器上传文件
(友好新手,tomcat配置文件位置:)
springmvc跨服务器上传文件
由上readonly属性解释可以看出tomcat是拒绝删除和放入操作的,所以这需要我们将readonly的属性在tomcat配置文件中设置为false,从而开启tomcat允许put和delete操作。(建议tomcat服务器全部打开,你要用的服务器)
配置内容:

    <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>
        <init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

在idea中给出tomcat服务器的配置图,分别如下:
springmvc跨服务器上传文件
分别配置一个服务器就OK了,端口号记得一定要不一样,不然会报端口占用错,到此所有工作结束了。作者运行无异常,下面链接给出跨服务器文件上传的各种异常处理方式。


可能出现异常的解决方案

相关标签: spring