java获取网络图片并上传oss
2016-03-30 23:04
633 查看
OSS,阿里云对象存储,这次项目中的图片都选择了这个存储方式。
因为做微信登录,所以在拿到用户头像的时候需要保持到oss,以免用户换头像后导致系统图片失效,影响用户的体验。
大体思路如下:
1.获取微信头像链接
2.将该图片写入本地
3.把刚刚写入的图片上传到oss
4.删除本地图片
上传oss的代码:
下载网络图片的代码:
获取当前时间的年月组合和当前时间的日,我们用这种方式命名文件夹,大家可以参考下:
图片的命名方法,按照当前毫秒数加随机数
ps:这里提到oss了,忘记说它的一个优点了,我觉得挺好的,共享下。
我们可以根据自己的需要选择图片的大小,相当于我们上传了一张图片图片,就有了100张图片。
http://image-demo.img-cn-hangzhou.aliyuncs.com/example.jpg@200h
后面的200h代表高度200px,高度根据比例变,还有其他改变方式,大家自行研究https://help.aliyun.com/document_detail/oss/oss-img-guide/resize/resize.html?spm=5176.docoss/product-documentation/intruduction.6.467.xokMaA
因为做微信登录,所以在拿到用户头像的时候需要保持到oss,以免用户换头像后导致系统图片失效,影响用户的体验。
大体思路如下:
1.获取微信头像链接
2.将该图片写入本地
3.把刚刚写入的图片上传到oss
4.删除本地图片
上传oss的代码:
public static String uploadHeadImg(String url) throws Exception { String imageName = imageName() + ".jpg"; //图片名称 String path=new File("").getAbsolutePath()+"/";<span style="white-space:pre"> </span>//这种方式可以拿到tomcat下的bin目录 client = new OSSClient(endpoint, accessKeyId, accessKeySecret); //初始化上传客户端 download(url, imageName, path); //下载图片到本地(见下面) File file = new File(path + imageName); //根据下载的文件创建新文件 //文件不存在,则上传默认头像 if (!file.exists()) { return ResourceUtil.getConfigByName("defaultphotourl"); } InputStream content = new FileInputStream(file); ObjectMetadata meta = new ObjectMetadata(); // 创建上传Object的Metadata meta.setContentLength(file.length()); // 必须设置ContentLength String keySuffixWithSlash = folderNameYM() + "/" + folderNameD() + "/"; // 上传Object.(这里的方法是生成根据时间生成文件夹名称的) client.putObject(bucketName, keySuffixWithSlash + imageName, content, meta); //图片上传到oss String ossPath = ResourceUtil.getConfigByName("oss-domain") + keySuffixWithSlash + imageName; //图片上传路径 if (file.exists()) {<span style="white-space:pre"> </span>//上传完成后,删除文件 file.delete(); } content.close();<span style="white-space:pre"> </span>//关闭所有链接 client.shutdown(); return ossPath; }
下载网络图片的代码:
/** * 下载图片到本地 * * @param urlString * @param filename * @param savePath * @throws Exception */ public static void download(String urlString, String filename, String savePath) throws Exception { // 构造URL URL url = new URL(urlString); // 打开连接 URLConnection con = url.openConnection(); //设置请求超时为5s con.setConnectTimeout(5 * 1000); // 输入流 InputStream is = con.getInputStream(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 File sf = new File(savePath); if (!sf.exists()) { sf.mkdirs(); } OutputStream os = new FileOutputStream(sf.getPath() + "/" + filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.close(); is.close(); }
获取当前时间的年月组合和当前时间的日,我们用这种方式命名文件夹,大家可以参考下:
/** * 文件夹名称-年月 * * @return */ public static String folderNameYM() { SimpleDateFormat formatter = new SimpleDateFormat("yyyyMM"); String strDate = formatter.format(new Date()); return strDate; } /** * 文件夹名称-天 * * @return */ public static String folderNameD() { SimpleDateFormat formatter = new SimpleDateFormat("dd"); String strDate = formatter.format(new Date()); return strDate; }
图片的命名方法,按照当前毫秒数加随机数
/** * 图片名称生成 * * @return */ public static String imageName() { Random random = new Random();//生成随机数 String strDate = Long.toString(System.currentTimeMillis()); for (int i = 0; i < 3; i++) { strDate = strDate + random.nextInt(9); } return strDate; }
ps:这里提到oss了,忘记说它的一个优点了,我觉得挺好的,共享下。
我们可以根据自己的需要选择图片的大小,相当于我们上传了一张图片图片,就有了100张图片。
http://image-demo.img-cn-hangzhou.aliyuncs.com/example.jpg@200h
后面的200h代表高度200px,高度根据比例变,还有其他改变方式,大家自行研究https://help.aliyun.com/document_detail/oss/oss-img-guide/resize/resize.html?spm=5176.docoss/product-documentation/intruduction.6.467.xokMaA
相关文章推荐
- HTTP协议总结
- Android 网络(一)
- #Android OkHttp使用教程
- [置顶] Android开发之开源框架OKHTTP的Get请求代码,得到json字符串方法
- TCP 通信原理
- Android OkHttp完全解析 是时候来了解OkHttp了
- 计算机网络小记1
- Linux学习笔记——重点推荐的Linux网络在线学习资源
- 网络相关系列之二:HTTP请求头与响应头
- 社交网络:有意义的不仅是邓巴数
- HTTP 错误 500.19 - Internal Server Error 错误解决
- ios9使用http
- Java Web 基础(一) 基于TCP的Socket网络编程
- iOS开发之网络连接方式
- iOS开发之网络请求
- 战火引擎中的网络模块
- 初学Socket
- Http协议
- http协议的两种主要请求方式post和get
- Android判断网络连接是否可用【从新浪云搬运】