背景
在日常开发过程中,我们会需要将第三方授权的用户头像上传保存至我们自己的服务器
例如:微信用户头像,在用户更改头像后,原先的头像地址会失效,这时我们如果直接使用该用户的微信头像图片地址,则会失效
那么我们就需要将微信用户的头像拉取存储到我们自己的文件服务器上,这样就不会失效了
1、将网络图片转化为 InputStream 对象
package com.mty.common.utils; import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; /** * 文件处理工具类 */ public class FileUtils { /** * 通过网络地址获取文件InputStream * * @param path 地址 * @return */ public static InputStream returnBitMap(String path) { if (StringUtils.isBlank(path)) { return null; } URL url = null; InputStream is = null; try { url = new URL(path); } catch (MalformedURLException e) { e.printStackTrace(); } try { // 利用HttpURLConnection对象,我们可以从网络中获取网页数据. HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.connect(); // 得到网络返回的输入流 is = conn.getInputStream(); } catch (IOException e) { e.printStackTrace(); } return is; } }
通过 HttpURLConnection 对象利用网络图片地址,将文件拉取下来转化为输入流对象
2、上传至文件服务器 Minio
/** * 上传微信头像 * * @param url 网络图片地址 * @return */ public String uploadFileWithNetFile(String url) { if (StringUtils.isBlank(url)) { return null; } try { InputStream inputStream = FileUtils.returnBitMap(url); // 判断上传文件是否为空 if (null == inputStream) { return null; } // 判断存储桶是否存在,不存在则创建 createBucket(MinioConst.MINIO_BUCKET); // uuid 生成文件名 String uuid = String.valueOf(UUID.randomUUID()); // 新的文件名 String fileName = "wxAvatar/" + DateUtils.getYyyymmdd() + "/" + uuid + ".jpg"; // 开始上传 client.putObject(MinioConst.MINIO_BUCKET, fileName, inputStream, "jpg"); // 返回图片的访问路径 return minioProp.getEndpoint() + "/" + MinioConst.MINIO_BUCKET + "/" + fileName; } catch (Exception e) { e.printStackTrace(); } return null; }
至此,我们就完成了将网络图片上传至自己的文件服务器操作