一、背景
最近有一个新需求,一个单位有两台服务器,一台公网服务器,用于部署微信公众号,一台内网服务器,上面部署着数据库和其他程序。要求单位内部的电脑只能访问内网服务器。微信公众号上传的图片,需要用户能访问,也需要单位内部访问。由于单位内部无法访问公网服务器(这是为什么呢?),所以,微信上传到公网服务器之后,还需要上传到内网服务器上去。
我大体百度了一下,我使用的是JAVA语言,有人用了jersey,jersey是个框架,好像还挺复杂,但由于需求比较急,没时间仔细看看到底是个什么东西。我只关心了如何从服务器上传到另一台服务器。
二、实现方式
使用jersey实现上述功能,
1. 首先,需要更改tomcat一个配置,打开tomcat/conf/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>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>
我的需求是将公网服务器的图片通过java代码上传到内网服务器上,所有修改的是内网服务器的tomcat。
2. web项目需要引入几个jar,网上说引入 jersey-client-1.19.1.jar、jersey-core-1.19.1.jar、commons-io-1.4.jar 这三个jar包,但是会出现几个错误,咱们一个一个来。
先分享一下jar包,这个是jersey所有的jar包,这个只用了上述的那两个。
链接:https://pan.baidu.com/s/1GCZr3XIr_x9rmkfaG1fgiw
提取码:dyw4
3. 根据自己的项目需要,加入如下代码:
//另一台服务器的地址
String url = "http://www.smarthui.top:80/memo/";
//读图片保存到内存
byte[] array = FileUtils.readFileToByteArray(file);
//实例化jersey实例
Client client = new Client();
//拼接地址
String uploadUrl = url + fileName;
// 设置请求路径
WebResource resource = client.resource(uploadUrl);
//发送开始 基于put提交
resource.put(String.class, array);
需要注意的一点就是,另一台服务器的地址,我的是"http://www.smarthui.top:80/memo/",memo文件夹要有,在tomcat的webapp下要有memo文件夹,否则会报404错误。文件夹根据自己的需要修改。
4. 这时候运行会出现报错:java.lang.ClassNotFoundException: javax.ws.rs.ext.Providers
小弟也不知为什么。。。。反正说ClassNotFound,我就是找了一个jar放进去了,javax.ws.rs-api-2.1.1.jar jar包我也分享出来。
链接:https://pan.baidu.com/s/1gQ5HjAcrHbPyXw3Yv-Jkmg
提取码:4gwj
加上就没有这个错误了。但是........不急,办法总会有的。
5. java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl 错误出现了。
这个网上有很多解决方案,比如:
如果使用的是Maven,请使用以下代码:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.22.2</version>
<scope>test</scope>
</dependency>
对于Gradle:
testCompile 'org.glassfish.jersey.core:jersey-common:2.22.2'
现在maven管理很常见,也很好用。可是这个项目我接手过来发现是用的导入jar包的形式,所以上述两种方式不可以啦。不过这个org.glassfish.jersey.core和jersey-common还是给了我提示,让我找到了相应的jar包。jersey-common-2.27.jar,分享一下:
链接:https://pan.baidu.com/s/1iupv6SC-Pe9JmZG3Mhr1kg
提取码:r6hm
代码中jersey都是使用的com.sun.jersey包,没了org.glassfish.jersey.还不行.......嗯...... 看来得学习一下org.glassfish.jersey放弃com.sun.jersey呀,哈哈哈
6. 重新发布之后就可以啦。