近期有做过一个简单的小功能,就是通过传过来的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提供的平台。