利用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. 重新发布之后就可以啦。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值