利用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返回给前端,直接用窗口打开就可以下载。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值