springmvc跨服务器上传文件
刚才作者做了一个测试,就是想方设法的将一个文件从本地上传到tomcat上,然后又由tomcat转发到另外一个服务器,由另外一个tomcat保存。但是报错了很多东西,不过作者还是一一解决了。现在将两个项目粘到这,说明文件跨服务器上传的原理。
说说作者想干的事情
如上图,在现在的企业中开发中,很多服务器是组合完成一个工作的。一个主服务器配置多个子服务器,每个子服务器专注一项工作,如上图,可能服务器B是用来处理数据分析的任务,服务器C用来对客户操作分析。对于一个多服务器的项目来说,客户端发送一个请求到服务器集群上,主服务器先取得客户端请求,然后根据客户端的请求调用子服务器的业务,或者直接给子服务器下达命令,让子服务器给主服务器回馈一个命令执行结果,比如说任务成功执行且完成了,反馈给主服务器一个success状态字,失败了返回一个failed状态字。
先说明服务器之间的套接关系,然后说明作者相干的事情,作者想由客户端上传一个文件,然后将文件的内容通过主服务器传递到服务器a上保存。就这么简单,跨服务器传递文件。
创建项目一springmvc_uploadFileSource(项目名可能不同,只不过那是作者的命名习惯而已,注重内容就好)
给出项目的目录结构如下所示:
给出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文件夹而已, 不过还是给出项目的目录结构。
target是部署到tomcat文件结构,这个项目是一个空项目,没有任何东西。
配置tomcat服务器
作者为了避免一个tomcat服务器无法区分问题,配置了两个服务器,分别是tomcat8和tomcat9。
给出tomcat配置文件中default项下的readonly解释:
(友好新手,tomcat配置文件位置:)
由上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服务器的配置图,分别如下:
分别配置一个服务器就OK了,端口号记得一定要不一样,不然会报端口占用错,到此所有工作结束了。作者运行无异常,下面链接给出跨服务器文件上传的各种异常处理方式。
下一篇: CAD下面的命令栏不见了怎么调出来?
推荐阅读