Java通过URL同步头像(总结)

       近期有做过一个简单的小功能,就是通过传过来的url地址获取到图片,并通过项目框架的接口方法将其上传到自己的项目平台上。首先,我将简单记录一下我对于自己的这个项目的实施,其次,说一下在实施过程所遇到的困难,最后便是总结一下这里所涉及的一些Java基础知识。

 项目实施:

        这里所使用的是自己公司的框架,需求是从一个平台同步对应账号的头像。基本框架已经完成,相应的参数也有传过来,所以我这里只需要拿到对应账号传过来的头像url地址。之后在进行加工处理。代码如下:

String avatarUrl = JsonUtil.getString(serviceNumber, "avatarUrl", "");

if (!StringUtil.isEmpty(avatarUrl)) {
          //同步头像
          try {
                  FileItem fileItem = urlConvertToFileItem(avatarUrl);
                  int size = urlGetPictureSize(avatarUrl);
                  PictureHome.getService().uploadAvatar(sc, fileItem,ServiceNumberHome.UNIT_ID, id, 0, 0, size);
                  System.out.println("----正常:" + avatarUrl);
                  System.out.println("----正常:" + id);

          } catch (Exception e) {
                  System.out.println("----异常:" + avatarUrl);
                  System.out.println("----异常:" + id);
          }
}

        如果可以拿到参数,则进行赋值,如果拿不到,则默认为空。之后判断是否为空再进行是否同步头像(因为并不是所有头像都是完好的,所以对同步不了的头像进行try...catch...)。小编所使用的平台可以调用已有的上传头像方法,结合其所需要的参数需要一一提供,其中需要稍加处理的便是fileItem和size参数。

 public static FileItem urlConvertToFileItem(String fileUrl) throws IOException {

        URL url = new URL(fileUrl);
        URLConnection conn = url.openConnection();
        conn.setConnectTimeout(30 * 1000);  // 连接超时:30s
        conn.setReadTimeout(1 * 1000 * 1000); // IO超时:1min
        conn.connect();

        // 创建输入流读取文件
        InputStream in = conn.getInputStream();
        FileItem fileItem = createFileItem(in, "itemFileName");//FileItem不用指定路径,内存形势存在。

        return fileItem;
    }

        首先是处理url。如果想调用平台的方法,则应当对接收到的url路径转化为FileItem对象。由于平台框架并未提供该转换的方法,所以小编在工具类中新建了如上的方法。拿到url,打开连接,将其转为输入流,最后再转为需要的FileItem对象返回给调用方法。

    public static int urlGetPictureSize(String fileUrl) throws IOException {

        URL url = new URL(fileUrl);
        URLConnection conn = url.openConnection();
        conn.setConnectTimeout(30 * 1000);  // 连接超时:30s
        conn.setReadTimeout(1 * 1000 * 1000); // IO超时:1min
        conn.connect();

        BufferedImage image = ImageIO.read(conn.getInputStream());
        int srcWidth = image.getWidth();      // 源图宽度
        int srcHeight = image.getHeight();    // 源图高度
        int size = srcWidth >= srcHeight ? srcHeight : srcWidth;

        return size;
    }

        由于上传头像的方法需要图片的参数,如大小,这就要从原图像中去获取了。当然也是从传入的avatarUrl中获取。此处也是抽成一个方法,通过ImageIO去读取url的输入流转化为图像流,再调用对应方法获取原图宽度和高度。对于提供的upload方法中的size我理解为的是原图的宽度和高度两者的最小值。

        至此,已经完成对参数的接收,处理,最后调用方法即可。这里附上同步头像前后效果。

同步前

同步后

:在处理将url转化为fileItem对象和从url中获得原图的这两个方法中,都需要拿到该图片的输入流,所以我们可以将这一部分抽成一段静态方法。

 private static URLConnection getConnection(String fileUrl) throws IOException {
     URL url = new URL(fileUrl);
     URLConnection conn = url.openConnection();
     conn.setConnectTimeout(30 * 1000);  // 连接超时:30s
     conn.setReadTimeout(1 * 1000 * 1000); // IO超时:1min
     conn.connect();
     return conn;
 }

        所以两个处理方法可以调此处代码。

        

所遇困难:

        整个业务流程下来看起来没有什么难度,但是对于不了解平台方法以及工具类,想要完成任务,还是有点困难的。所以此处附上小编的一点建议:对于不熟悉公司框架而有任务需要完成的,需要多请教前辈一下,毕竟这是他们赖以工作的工具。这里也附上我之前不成熟的解决想法,和实际操作还是有很大差距的。

总结:

        在最后总结一下所用到的基础知识点:

        URL转输入流:

        url转输入流,传入的是String类型,需要调用URL对象进行实例化,并传入url。通过新生成的URL实例对象调用openConnection()方法可以返回URLConnection对象,在这里也可以调用一些方法设置连接参数,具体不再详细赘述,可以移步查看。

URLConnection类,HttpURLConnection类的使用和总结

        输入流和输出流:

        输入输出的方向是针对程序而言,向程序中读入数据,就是输入流;从程序中向外写出数据,就是输出流。

        简单来讲:
        你编写了一个java程序,
        你用这个java程序从你的电脑上读取文件,就是输入流;

        此外,输入输出流还可以划分为字节输入输出流和字符输入输出流,详细见:

        字节输入输出流和字符输入输出流

        三目运算符:

        能看到这的想必都有一定功底了,就简单的说一下吧!    

        对于有些选择分支结构,可以使用简单的条件运算符来代替. 如:

        if(a<b)
                min=a;
        else
                min=b;

        也可以用下面的条件运算符来处理:

        min=(a<b)?a:b;

        其中"(a<b)?a:b"是一个"条件表达式",它是这样执行的: 如果a<b为真,则表达式取a值,否则取b值.

  条件运算符由两个符号组成"?"和":", 要求有3个操作对象,所以也叫它三目运算符。它的一般形式为:

                表达式1?表达式2:表达式3;

        此外,在处理业务时,小编遇到FileItem,File和MultipartFile的问题,以及MetaData的相关问题,小编日后会再详细列出介绍。

        新人撰稿,多方借鉴,如有侵权,请联系小编删除,感谢读者,感谢CSDN提供的平台。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值