一、背景
最近有一個新需求,一個單位有兩臺服務器,一臺公網服務器,用於部署微信公衆號,一臺內網服務器,上面部署着數據庫和其他程序。要求單位內部的電腦只能訪問內網服務器。微信公衆號上傳的圖片,需要用戶能訪問,也需要單位內部訪問。由於單位內部無法訪問公網服務器(這是爲什麼呢?),所以,微信上傳到公網服務器之後,還需要上傳到內網服務器上去。
我大體百度了一下,我使用的是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. 重新發布之後就可以啦。