maven:
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.4.0</version> </dependency>
@Configuration public class SpringConfig { @Autowired Environment env; @Bean(destroyMethod = "shutdown") public OSSClient ossClient() { return new OSSClient(env.getProperty("oss.userImageEndpoint"), env.getProperty("oss.accessKeyId"), env.getProperty("oss.accessKeySecret")); } }
@Component public class ImageUploader { private static final Logger LOG = LoggerFactory.getLogger(ImageUploader.class); @Autowired private OSSClient ossClient; @Value("${oss.userBucketName}") private String userBucketName; @Value("${oss.userImageKeyPrefix}") private String userImageKeyPrefix; @Value("${oss.userImageEndpoint}") private String userImageEndpoint; /** * 上传第三方图片,将第三方图片流转为 OSS 图片流 * * @param url 第三方图片链接 * @return OSS 生成后的链接 */ public String uploadThirdImage(String url) { LOG.info("要下载的图片URL:'{}'",url); PutObjectResult putObjectResult = null; try { InputStream inputStream = new URL(url).openStream(); String key = userImageKeyPrefix + UUID.randomUUID().toString() + ".png"; putObjectResult = ossClient.putObject(userBucketName, key, inputStream); return userImageEndpoint + "/" + key; } catch (IOException e) { // Fix by liyunfeng,20170608,微信头像有可能无法显示,这里转换会出现http 400现象,抛出异常会导致用户登录界面出现系统异常 // 上层进行捕获 throw new RuntimeException(e); } finally { if (putObjectResult != null && putObjectResult.getCallbackResponseBody() != null) { try { putObjectResult.getCallbackResponseBody().close(); } catch (IOException ignore) { } } } } }下载微信图片到服务器,再上传到OSS
private String mediaGet="https://api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}";
/** * 根据accessToken和mediaId下载微信图片,上次到oss服务器 * @param accessToken * @param mediaId * @return */ public String uploadWechatMediaImage(String accessToken, String mediaId){ String url = MessageFormat.format(mediaGet, accessToken, mediaId); LOG.info("微信下载地址url:'{}'",url); String imageName = UUID.randomUUID().toString() + ".png";//图片名称 String key = userImageKeyPrefix +imageName; String path=new File("").getAbsolutePath()+"/"; PutObjectResult putObjectResult = null; try { LOG.info("开始下载"); download(url, imageName, path+userImageKeyPrefix); LOG.info("下载图片成功。。。。。"); File file = new File(path + key); ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata meta.setContentLength(file.length());// 必须设置ContentLength meta.setContentType("image/png"); putObjectResult = ossClient.putObject(userBucketName, key, file, meta); if (file.exists()) { file.delete(); } return userImageEndpoint + "/" + key; } catch (Exception e) { throw new RuntimeException(e); } finally { if (putObjectResult != null && putObjectResult.getCallbackResponseBody() != null) { try { putObjectResult.getCallbackResponseBody().close(); } catch (IOException ignore) { } } } }
/** * 下载图片到本地 * * @param urlString * @param filename * @param savePath * @throws Exception */ public void download(String urlString, String filename, String savePath) throws Exception { LOG.info("新生成图片名:'{}'",filename); LOG.info("保存到服务器路径:'{}'",savePath); long start = System.currentTimeMillis(); // 构造URL URL url = new URL(urlString); //打开链接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求方式为"GET" conn.setRequestMethod("GET"); //超时响应时间为5秒 conn.setConnectTimeout(5 * 1000); //通过输入流获取图片数据 InputStream inStream = conn.getInputStream(); //得到图片的二进制数据,以二进制封装得到数据,具有通用性 byte[] data = readInputStream(inStream); //new一个文件对象用来保存图片,默认保存当前工程根目录 File imageFile = new File(savePath); if (!imageFile.exists() && !imageFile.isDirectory()) { imageFile.mkdirs(); } //创建输出流 FileOutputStream outStream = new FileOutputStream(imageFile.getPath() + "/" + filename); //写入数据 outStream.write(data); //关闭输出流 outStream.close(); LOG.info("下载耗时:'{}'",System.currentTimeMillis()-start); }
private byte[] readInputStream(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 while( (len=inStream.read(buffer)) != -1 ){ //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输入流 inStream.close(); //把outStream里的数据写入内存 return outStream.toByteArray(); }