java利用oss实现下载功能

 更新时间:2019年10月31日 09:31:01   作者:汪家人  
这篇文章主要为大家详细介绍了java利用oss实现下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了如何利用oss实现下载功能的具体代码,供大家参考,具体内容如下

目前我接触的实现下载功能有3种方式。第一种,就是把要下载的内容写到本地目录,然后把目录返回给前端,利用a标签下载。第二种,本地不允许访问,挂载目录,使目录可以对外访问,同样的,把目录返给前端下载。第三种,使用第三方存储,其中阿里云oss就是一种可以用来实现的对象存储。

首先,导入依赖包

<dependency>
  <groupId>com.aliyun.oss</groupId>
  <artifactId>aliyun-sdk-oss</artifactId>
  <version>3.6.0</version>
 </dependency>

参数类

public class OssParams {
 
 public static final String endpoint = "oss-cn-hangzhou.aliyuncs.com"; 
 public static final String accessKeyId = "";
 public static final String accessKeySecret = ""; 
 public static final String bucketName = "";
 
 public static final String rootName = "";//根目录
}

工具类

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.AppendObjectRequest;
import com.aliyun.oss.model.ObjectMetadata;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.io.ByteArrayInputStream;
import java.net.URL;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;
 
import static OssParams.bucketName;
 
/**
 * 先做单例对象调用,防止多线程并发bug
 * 后期加入线程锁控制后,做成公共utils
 */
public class WriteLeadsOssUtils {
 private static Logger LOG = LoggerFactory.getLogger(WriteLeadsOssUtils.class.getName());
 
 private static final String fileSub = ".csv";
 
 private AtomicLong atomicLong = new AtomicLong(0L);
 
 private WriteLeadsOssUtils() {
 }
 
 private static class BuildWriteOSS {
  private static final WriteLeadsOssUtils instance = new WriteLeadsOssUtils();
 }
 
 public static WriteLeadsOssUtils getInstance() {
  return BuildWriteOSS.instance;
 }
 
 private OSS getOssClient() {
  return new OSSClientBuilder().build(OssParams.endpoint, OssParams.accessKeyId, OssParams.accessKeySecret);
 }
 
 public URL writeJSONObjectFile(String content,String fileName) {
  // 创建OSSClient实例。
  OSS ossClient = getOssClient();
  try {
   DateTime currentTime = new DateTime(System.currentTimeMillis());
//   String objectName = OssParams.rootName + currentTime.toString("yyyy-MM-dd-HH") + fileSub;
   String objectName = OssParams.rootName + fileName;
//   AppendObjectRequest appendObjectRequest = null;
   String data = content;
 
   ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
 
   Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 180);
   URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
 
   LOG.info("{} saved to OSS, url={}", objectName,url.toString());
//   for (IngestLeadingRequest param : params) {
//    String jsonStr = JSONObject.toJSONString(param);
//    JSONObject object = JSONObject.parseObject(jsonStr);
//    data += object.toJSONString() + "\n";
//   }
   //文件不存在
//   if (!ossClient.doesObjectExist(OssParams.bucketName, objectName)) {
//    atomicLong.set(0L);
//    appendObjectRequest = getAppendObjectRequest(data, true, objectName);
//    appendObjectRequest.setPosition(0L);
//   } else {
//    appendObjectRequest = getAppendObjectRequest(data, false, objectName);
//   }
//   AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
//   atomicLong.set(appendObjectResult.getNextPosition());
//   System.gc();
   return url;
  } catch (OSSException e) {
   e.printStackTrace();
   return null;
  } catch (ClientException e) {
   e.printStackTrace();
   return null;
  } finally {
   ossClient.shutdown();
  }
 }
 
 
 /**
  * flag标志位,true为新文件,false为追加文件
  *
  * @param data
  * @param flag
  * @param objectName
  * @return
  */
 private AppendObjectRequest getAppendObjectRequest(String data, Boolean flag, String objectName) {
  ObjectMetadata meta = new ObjectMetadata();
  // 指定上传的内容类型。
  meta.setContentType("text/plain;charset=utf-8");
  if (flag == true) {
   return new AppendObjectRequest(bucketName, objectName,
     new ByteArrayInputStream(data.getBytes()), meta);
  } else {
   return new AppendObjectRequest(bucketName, objectName,
     new ByteArrayInputStream(data.getBytes()), meta).withPosition(atomicLong.get());
  }
 }
}

调用方法

WriteLeadsOssUtils.getInstance().writeJSONObjectFile("hello");
//将hello作为内容存入oss,并获得可以下载的url

利用上述方式,可以直接将可以下载的url返回给前端,直接用窗口打开就可以下载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现黄金分割法的示例代码

    Java实现黄金分割法的示例代码

    黄金分割法是一种区间收缩方法。所谓区间收缩方法,指的是将含有最优解的区间逐步缩小,直至区间长度为零的方法。本文将用Java实现这一算法,需要的可以参考一下
    2022-03-03
  • SpringSecurity添加图形验证码认证实现

    SpringSecurity添加图形验证码认证实现

    本文主要介绍了SpringSecurity添加图形验证码认证实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • java中的arrays.sort()代码详解

    java中的arrays.sort()代码详解

    这篇文章主要介绍了Java中的Arrays.sort()代码详解,涉及Arrays.sort()简单示例,策略模式,”super”的使用等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java数据结构之平衡二叉树的实现详解

    Java数据结构之平衡二叉树的实现详解

    平衡二叉树又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。本文将详解介绍一下平衡二叉树的原理与实现,需要的可以参考一下
    2022-03-03
  • SpringBoot单元测试使用@Test没有run方法的解决方案

    SpringBoot单元测试使用@Test没有run方法的解决方案

    这篇文章主要介绍了SpringBoot单元测试使用@Test没有run方法的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java属性文件操作之Properties与ResourceBundle详解

    Java属性文件操作之Properties与ResourceBundle详解

    这篇文章主要介绍了Java属性文件操作之Properties与ResourceBundle详解,两个类都可以读取属性文件中以key/value形式存储的键值对,ResourceBundle读取属性文件时操作相对简单,需要的朋友可以参考下
    2023-11-11
  • 详解Java多线程编程中LockSupport类的线程阻塞用法

    详解Java多线程编程中LockSupport类的线程阻塞用法

    LockSupport类提供了park()和unpark()两个方法来实现线程的阻塞和唤醒,下面我们就来详解Java多线程编程中LockSupport类的线程阻塞用法:
    2016-07-07
  • java解析Excel文件的方法实例详解

    java解析Excel文件的方法实例详解

    在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,下面这篇文章主要给大家介绍了关于java解析Excel文件的方法,需要的朋友可以参考下
    2022-06-06
  • java对象和json的来回转换知识点总结

    java对象和json的来回转换知识点总结

    在本篇文章里小编给大家分享了一篇关于java对象和json的来回转换知识点总结内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • 如何实现自己的spring boot starter

    如何实现自己的spring boot starter

    这篇文章主要介绍了如何实现自己的spring boot starter,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论