利用oss实现下载功能

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

首先,导入依赖包


        com.aliyun.oss
        aliyun-sdk-oss
        3.6.0
 

参数类

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)