利用jersey,將圖片上傳到另一臺服務器

一、背景

最近有一個新需求,一個單位有兩臺服務器,一臺公網服務器,用於部署微信公衆號,一臺內網服務器,上面部署着數據庫和其他程序。要求單位內部的電腦只能訪問內網服務器。微信公衆號上傳的圖片,需要用戶能訪問,也需要單位內部訪問。由於單位內部無法訪問公網服務器(這是爲什麼呢?),所以,微信上傳到公網服務器之後,還需要上傳到內網服務器上去。

我大體百度了一下,我使用的是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. 重新發布之後就可以啦。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章