【文件上传】阿里OSS文件存储:Java使用阿里云OSS上传文件,普通上传与分片上传,轻轻松松上传小文件、大文件

阿里OSS文件存储

例如:阿里OSS文件存储:Java使用阿里云OSS上传文件,普通上传与分片上传,轻轻松松上传小文件、大文件


使用阿里云OSS服务先要去官网申请:阿里云API的密钥AccessKeyID阿里云API的密钥AccessKeySecret 有了这两个才能进行开发。

2.读入数据

代码如下(示例):

FileService
public Map<String, String> uploadFile(MultipartFile file) throws ValidationException {
        String saveUrl = "";
        try {
            log.info("------文件上传方法执行------");
            long startTime = System.currentTimeMillis();
            // 阿里OSS
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            Date date = new Date();
            // 阿里云API的文件夹名称(子文件夹)
            String format = dateFormat.format(date) + "/";
            // 文件名
            String formats = String.valueOf(UUID.randomUUID());
            // MultipartFile 转 File
            File newFile = MultipartFileToFileUtil.multipartFileToFile(file);
            // 返回结果 resultArr[0]:唯一MD5数字签名  resultArr[1]:如:"appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk"
            String[] resultArr = AliyunOSSClientUtil.uploadObject2OSS(AliyunOSSClientUtil.getOSSClient(), newFile, bucketName, folder, format, formats);
            // 网络URL地址:s端传入cdn链接 + resultArr[1]
            if (resultArr != null) {
                String path = resultArr[1];
                // 保存路径url地址:http://zhiliaoappversion.oss-cn-beijing.aliyuncs.com/appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk
                saveUrl = AliyunOSSClientUtil.getUrl(bucketName, path);
            }
            // 删除本地临时文件
            MultipartFileToFileUtil.deleteTempFile(newFile);
            long endTime = System.currentTimeMillis();
            log.info("------文件上传成功,耗时" + ((endTime - startTime) / 1000) + "s------");
            Map<String, String> dataMap = new HashMap<>(3);
            dataMap.put("name", newFile.getName());
            dataMap.put("url", saveUrl);
            return dataMap;
        }catch (Exception e) {
            e.printStackTrace();
            log.info("------文件上传失败------");
            Map<String, String> dataMap = new HashMap<>(2);
            dataMap.put("name", "上传失败");
            dataMap.put("url", "上传失败");
            return dataMap;
        }
    }
AiyunOSSClientUtil
/**
     * 获取阿里云OSS客户端对象
     *
     * @return ossClient
     */
    public static OSS getOSSClient() {
        ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
        // 连接空闲超时时间,超时则关闭
        conf.setIdleConnectionTime(1000);
        return new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET, conf);
    }

    /**
     * 创建桶
     *
     * @param ossClient  OSS连接
     * @param bucketName 桶名称
     * @return
     */
    public static String createBucketName(OSS ossClient, String bucketName) {
        if (!ossClient.doesBucketExist(bucketName)) {
            //创建存储空间
            Bucket bucket = ossClient.createBucket(bucketName);
            log.info("创建存储空间成功");
            return bucket.getName();
        }
        return bucketName;
    }

    /**
     * 删除桶
     *
     * @param ossClient  oss对象
     * @param bucketName 桶名称
     */
    public static void deleteBucket(OSS ossClient, String bucketName) {
        ossClient.deleteBucket(bucketName);
        log.info("删除" + bucketName + "桶成功");
    }

    /**
     * 上传图片至OSS 文件流
     *
     * @param ossClient  oss连接
     * @param file       上传文件(文件全路径如:D:\\image\\cake.jpg)
     * @param bucketName 桶名称
     * @param folder     阿里云API的文件夹名称(父文件夹)
     * @param format     阿里云API的文件夹名称(子文件夹)
     * @param formats    文件名
     * @return String 返回的唯一MD5数字签名
     */
    public static String[] uploadObject2OSS(OSS ossClient, File file, String bucketName, String folder, String format, String formats) {
        String[] resultArr = new String[2];
        try {
            // 以输入流的形式上传文件(普通上传)
            folder = folder + format;
            InputStream is = new FileInputStream(file);
            // 文件名
            String fileName = file.getName();
            // 文件扩展名
            String fileExtension = fileName.substring(fileName.lastIndexOf("."));
            // 最终文件名:UUID + 文件扩展名
            fileName = formats + fileExtension;
            // 上传路径 如:appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk
            String path = folder + fileName;
            log.info("上传到路径" + path);
            // 文件大小
            long fileSize = file.length();
            // 创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            // 上传的文件的长度
            metadata.setContentLength(is.available());
            // 指定该Object被下载时的网页的缓存行为
            metadata.setCacheControl("no-cache");
            // 指定该Object下设置Header
            metadata.setHeader("Pragma", "no-cache");
            // 指定该Object被下载时的内容编码格式
            metadata.setContentEncoding("utf-8");
            // 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
            // 如果没有扩展名则填默认值application/octet-stream
            metadata.setContentType(getContentType(fileExtension));
            // 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
            // 上传文件 (上传文件流的形式)
            PutObjectResult putResult = ossClient.putObject(bucketName, path, is, metadata);
            // 解析结果
            resultArr[0] = putResult.getETag();
            resultArr[1] = path;
            is.close();
            ossClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
        } finally {
            // 关闭OSSClient
            ossClient.shutdown();
        }
        return resultArr;
    }

    /**
     * 获得url链接
     *
     * @param bucketName 桶名称
     * @param key        Bucket下的文件的路径名+文件名 如:"appversion/20200723/a3662009-897c-43ea-a6d8-466ab8310c6b.apk"
     * @return 图片链接:http://xxxxx.oss-cn-beijing.aliyuncs.com/test/headImage/1546404670068899.jpg?Expires=1861774699&OSSAccessKeyId=****=p%2BuzEEp%2F3JzcHzm%2FtAYA9U5JM4I%3D
     * (Expires=1861774699&OSSAccessKeyId=LTAISWCu15mkrjRw&Signature=p%2BuzEEp%2F3JzcHzm%2FtAYA9U5JM4I%3D 分别为:有前期、keyID、签名)
     */
    public static String getUrl(String bucketName, String key) {
        // 设置URL过期时间为10年  3600L*1000*24*365*10
        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
        OSS ossClient = getOSSClient();
        // 生成URL
        URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
        return url.toString();
    }

    /**
     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
     *
     * @param fileExtension 文件名扩展名
     * @return 文件的contentType
     */
    public static String getContentType(String fileExtension) {
        // 文件的后缀名
        if (".bmp".equalsIgnoreCase(fileExtension)) {
            return "image/bmp";
        }
        if (".gif".equalsIgnoreCase(fileExtension)) {
            return "image/gif";
        }
        if (".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)
                || ".png".equalsIgnoreCase(fileExtension)) {
            return "image/jpeg";
        }
        if (".html".equalsIgnoreCase(fileExtension)) {
            return "text/html";
        }
        if (".txt".equalsIgnoreCase(fileExtension)) {
            return "text/plain";
        }
        if (".vsd".equalsIgnoreCase(fileExtension)) {
            return "application/vnd.visio";
        }
        if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
            return "application/vnd.ms-powerpoint";
        }
        if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
            return "application/msword";
        }
        if (".xml".equalsIgnoreCase(fileExtension)) {
            return "text/xml";
        }
        if (".mp4".equalsIgnoreCase(fileExtension)) {
            return "video/mp4";
        }
        // android
        if (".apk".equalsIgnoreCase(fileExtension)) {
            return "application/vnd.android.package-archive";
        }
        // ios
        if (".ipa".equals(fileExtension)) {
            return "application/vnd.iphone";
        }
        // 默认返回类型
        return "application/octet-stream";
    }

MultipartFileToFileUtil
/**
 * @ClassName MultipartFileToFileUtil
 * @Description:
 * @Author JYY
 * @Date 2022/4/25
 **/
public class MultipartFileToFileUtil {
    /**
     * MultipartFile 转 File
     *
     * @param file
     * @throws Exception
     */
    public static File multipartFileToFile(MultipartFile file) {
        try {
            File toFile;
            if (file != null && file.getSize() > 0) {
                InputStream ins = null;
                ins = file.getInputStream();
                toFile = new File(file.getOriginalFilename());
                inputStreamToFile(ins, toFile);
                ins.close();
                return toFile;
            }
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取流文件
     *
     * @param ins
     * @param file
     */
    public static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除本地临时文件
     *
     * @param file
     */
    public static void deleteTempFile(File file) {
        if (file != null) {
            File del = new File(file.toURI());
            del.delete();
        }
    }


}

yml配置
aliyunOSS:
  endpoint:  # 阿里云API的内或外网域名
  accessKeyId:  # 阿里云API的密钥AccessKeyID
  accessKeySecret: P # 阿里云API的密钥AccessKeySecret
  bucketName:  # bucket(桶)名称
  folder: uploadfile/

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值