阿里云实现大文件上传

在Java Spring Boot项目中使用阿里云平台实现大文件存储,并提升文件的存储与读取效率,可以通过集成阿里云的对象存储服务(OSS)。阿里云OSS是一个海量、安全、低成本、高可靠的云存储服务,非常适合大文件存储需求。

1. 配置阿里云OSS客户端

创建配置类来初始化OSS客户端。需要获取阿里云的AccessKeyId、AccessKeySecret以及Endpoint。

@Configuration
public class OssConfig {

    private String endpoint = "https://oss-cn-your-region.aliyuncs.com"; // 替换为实际的endpoint
    private String accessKeyId = "your-access-key-id";  // 替换为实际的AccessKeyId
    private String accessKeySecret = "your-access-key-secret";  // 替换为实际的AccessKeySecret

    @Bean
    public OSS ossClient() {
        return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }
}

2. 上传文件到OSS

通过Spring Boot的@Service注解创建一个服务类,来实现上传大文件到OSS。

@Service
public class OssService {

    @Autowired
    private OSS ossClient;

    private String bucketName = "your-bucket-name";  // 替换为你的Bucket名称

    public String uploadFile(MultipartFile file) throws Exception {
        String fileName = file.getOriginalFilename();
        InputStream inputStream = file.getInputStream();

        // 将文件上传到指定的存储桶
        ossClient.putObject(bucketName, fileName, inputStream);

        // 返回文件的访问URL
        return "https://" + bucketName + ".oss-cn-your-region.aliyuncs.com/" + fileName;
    }
}

3. 文件下载

提供文件下载接口,以便能够从OSS上读取文件。

@Service
public class OssDownloadService {

    @Autowired
    private OSS ossClient;

    private String bucketName = "your-bucket-name";

    public InputStream downloadFile(String fileName) {
        // 从OSS下载文件
        return ossClient.getObject(bucketName, fileName).getObjectContent();
    }
}

4. 提升存储与读取效率的建议

  • 分片上传:对于大文件,阿里云OSS支持分片上传,这样可以大大提升上传效率。分片上传的工作原理是将大文件分割成多个小片段分别上传,最后再合并。
  • CDN加速:如果文件主要用于静态资源访问,可以启用阿里云的CDN(内容分发网络)来加速文件读取和下载,特别是提升地理分布式的用户访问速度。
  • 并发处理:对于文件上传和下载,可以通过异步或多线程的方式提高效率。

5. 分片上传示例

使用阿里云OSS提供的MultipartUploadRequest来实现分片上传。

@Service
public class OssMultipartUploadService {

    @Autowired
    private OSS ossClient;

    private String bucketName = "your-bucket-name";

    public String multipartUpload(MultipartFile file) throws Exception {
        String fileName = file.getOriginalFilename();
        InputStream inputStream = file.getInputStream();

        // 初始化分片上传
        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, fileName);
        String uploadId = ossClient.initiateMultipartUpload(request).getUploadId();

        List<PartETag> partETags = new ArrayList<>();
        int partSize = 1024 * 1024 * 5;  // 每个分片5MB
        byte[] buffer = new byte[partSize];
        int bytesRead;
        int partNumber = 1;

        while ((bytesRead = inputStream.read(buffer)) != -1) {
            UploadPartRequest uploadPartRequest = new UploadPartRequest();
            uploadPartRequest.setBucketName(bucketName);
            uploadPartRequest.setKey(fileName);
            uploadPartRequest.setUploadId(uploadId);
            uploadPartRequest.setInputStream(inputStream);
            uploadPartRequest.setPartSize(bytesRead);
            uploadPartRequest.setPartNumber(partNumber++);

            partETags.add(ossClient.uploadPart(uploadPartRequest).getPartETag());
        }

        // 完成分片上传
        CompleteMultipartUploadRequest completeMultipartUploadRequest = 
                new CompleteMultipartUploadRequest(bucketName, fileName, uploadId, partETags);
        ossClient.completeMultipartUpload(completeMultipartUploadRequest);

        return "https://" + bucketName + ".oss-cn-your-region.aliyuncs.com/" + fileName;
    }
}

6. 断点续传示例

在Spring Boot 项目中,使用阿里云 OSS(对象存储服务)上传大文件时,可以引入 断点续传机制 来确保大文件上传过程中因网络波动或其他原因中断时,能够从中断的地方继续上传。阿里云 OSS SDK 提供了断点续传上传的功能,称为 Resumable Upload。该内置的断点续传上传功能,可以通过 OSSResumableUpload 来实现。该功能会自动记录上传的状态,并在下次上传时恢复进度。

断点续传是基于分片上传实现的,因此它包括了多线程、也包括了上传失败后重试机制。

1. 实现断点续传功能

确保前提已经在代码中配置好了阿里云客户端。断点续传功能需要在上传过程中自动保存上传进度,可以通过阿里云的 OSSResumableUpload API 实现。下面的示例代码展示了如何实现断点续传的大文件上传:

@Service
public class OssResumableUploadService {

    @Autowired
    private OSS ossClient;

    private String bucketName = "your-bucket-name"; // 替换为你的bucket名称

    public String resumableUpload(MultipartFile multipartFile) throws Exception {
        String fileName = multipartFile.getOriginalFilename();
        String localTempFilePath = "/tmp/" + fileName; // 需要有临时存储路径来保存中间文件

        // 将 MultipartFile 保存到本地的临时文件
        File tempFile = new File(localTempFilePath);
        multipartFile.transferTo(tempFile);

        // 配置分片大小,并且设置本地记录文件来记录进度
        UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName, fileName);
        uploadFileRequest.setUploadFile(tempFile.getPath());
        uploadFileRequest.setPartSize(1024 * 1024 * 5); // 设置每个分片的大小为5MB
        uploadFileRequest.setTaskNum(5); // 设置并发线程数
        uploadFileRequest.setEnableCheckpoint(true); // 启用断点续传

        // 执行断点续传上传
        ossClient.uploadFile(uploadFileRequest);

        // 清理临时文件
        tempFile.delete();

        // 返回文件的访问URL
        return "https://" + bucketName + ".oss-cn-your-region.aliyuncs.com/" + fileName;
    }
}

代码解释

  1. 临时文件存储:将 MultipartFile 转换为本地文件,因为阿里云 OSS 的断点续传需要依赖本地文件来记录上传的进度。
  2. 分片大小和并发控制:设置了每个分片的大小为 5MB,并使用 5 个并发线程来上传,提升上传效率。
  3. 断点续传启用:通过 setEnableCheckpoint(true) 启用断点续传机制。阿里云 OSS 会在本地生成一个 .ossupload 的文件,记录上传的进度。如果上传中断,重新调用该方法时会自动从上次中断的地方继续上传。
  4. 删除临时文件:上传成功后,将本地的临时文件删除。

2. 上传进度回调

可以实现上传进度回调,以便在上传过程中获取当前的上传状态:

uploadFileRequest.setProgressListener(new ProgressListener() {
    @Override
    public void progressChanged(ProgressEvent progressEvent) {
        long bytes = progressEvent.getBytes();
        System.out.println("Uploaded bytes: " + bytes);
    }
});

3. 文件下载断点续传

断点续传不仅限于上传,在文件下载过程中,也可以通过阿里云 OSS 提供的 ResumableDownloadRequest 实现断点续传下载。如果下载过程中断,可以从中断处继续。

在阿里云 OSS 的文件 断点续传下载 中,默认情况下 没有内置的自动重试功能。但是,阿里云 OSS SDK 支持对下载失败后的手动重试,也就是说,如果下载失败,可以自行实现重试逻辑,结合断点续传的功能,从中断处继续下载。例如下面的代码:

@Service
public class OssDownloadServiceWithRetry {

    @Autowired
    private OssClientService ossClientService;

    public void downloadFileWithRetry(String objectName, String downloadFilePath, int maxRetryCount) throws Throwable {
        OSS ossClient = ossClientService.createOssClient();
        int retryCount = 0;
        boolean downloadSuccess = false;

        while (!downloadSuccess && retryCount < maxRetryCount) {
            try {
                // 设置断点续传下载请求
                DownloadFileRequest downloadFileRequest = new DownloadFileRequest(ossClientService.getBucketName(), objectName);
                downloadFileRequest.setDownloadFile(downloadFilePath);  // 本地存储路径
                downloadFileRequest.setPartSize(1024 * 1024 * 5);  // 设置每个分片的大小为5MB
                downloadFileRequest.setTaskNum(5);  // 设置并发下载线程数
                downloadFileRequest.setEnableCheckpoint(true);  // 启用断点续传

                // 下载文件
                DownloadFileResult downloadFileResult = ossClient.downloadFile(downloadFileRequest);
                downloadSuccess = true;  // 下载成功
                System.out.println("文件下载成功,ETag:" + downloadFileResult.getObjectMetadata().getETag());
            } catch (Throwable t) {
                retryCount++;
                System.err.println("文件下载失败,重试次数:" + retryCount);
                if (retryCount >= maxRetryCount) {
                    throw new Exception("文件下载失败,超过最大重试次数");
                }
            }
        }

        // 关闭OSS客户端
        ossClient.shutdown();
    }
}

实现要点

  1. 断点续传功能:阿里云 OSS SDK 提供的断点续传会自动记录下载进度,生成本地 .ossdownload 文件,当下载中断或失败后,SDK 可以从中断的地方继续下载。
  2. 重试机制:可以通过自定义重试逻辑,实现对下载失败的重试操作。每次重试会基于上次中断处继续,不需要从头开始下载。
  3. 最大重试次数:为了避免无限重试,可以设置一个合理的最大重试次数,例如网络条件不好时,允许重试 3-5 次。

7. 阿里云oss结合阿里云CDN

在 Spring Boot 项目中,通过阿里云 OSS 结合 CDN 可以实现大文件的加速访问。阿里云 OSS 提供了存储服务,而 CDN(内容分发网络)通过将资源分发到全球的边缘节点,减少延迟并提高访问速度。结合这两者,用户可以快速、高效地访问存储在 OSS 上的大文件。下面是具体实现步骤:

1. 创建 OSS 存储桶并配置 CDN 加速

  • 登录阿里云控制台,创建一个 OSS 存储桶,并将你需要存储的大文件上传到该存储桶。
  • 在 CDN 控制台中,添加一个加速域名,并将该加速域名的源站设置为 阿里云 OSS 存储桶,以便 CDN 可以访问 OSS 上的文件资源。配置完成后,CDN 会从 OSS 获取资源并缓存到各个边缘节点。

2. CDN 域名与 OSS 域名的配置

  • CDN 加速域名可以配置为与 OSS 的自定义域名不同,例如 cdn.example.com 指向 CDN,而 oss.example.com 是 OSS 的源站域名。
  • 确保在 OSS 控制台中,为你的存储桶开启了公共读权限或配置了适当的访问策略,使得 CDN 可以访问 OSS 文件。

3. Spring Boot 中配置阿里云 OSS SDK

在 Spring Boot 项目中,通过引入阿里云 OSS SDK,可以上传和管理存储在 OSS 上的文件。

4. 上传文件到阿里云 OSS

使用阿里云 OSS SDK 实现文件上传。文件上传到 OSS 后,使用 CDN 加速域名来提供访问链接。

@Service
public class OssService {

    private String endpoint = "https://oss-cn-your-region.aliyuncs.com";  // OSS区域
    private String accessKeyId = "your-access-key-id";
    private String accessKeySecret = "your-access-key-secret";
    private String bucketName = "your-bucket-name";
    private String cdnDomain = "https://cdn.example.com";  // 配置的CDN加速域名

    // 实现异步上传
    @Async
    public String uploadFile(String objectName, InputStream inputStream) {
        // 创建OSS客户端
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 上传文件到OSS
            ossClient.putObject(bucketName, objectName, inputStream);

            // 返回CDN加速域名的访问链接
            return cdnDomain + "/" + objectName;
        } finally {
            // 关闭OSS客户端
            ossClient.shutdown();
        }
    }
}

5. 控制器接口

在 Spring Boot 的控制器中提供文件上传接口,并返回经过 CDN 加速的文件访问链接。

@RestController
public class FileUploadController {

    @Autowired
    private OssService ossService;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        // 获取文件名
        String objectName = file.getOriginalFilename();

        // 上传文件到OSS,并获取CDN加速的访问链接
        return ossService.uploadFile(objectName, file.getInputStream());
    }
}

6. CDN 配置优化

1. 缓存策略

在阿里云 CDN 控制台中,配置合适的缓存策略。对于大文件,可以设置较长的缓存过期时间,减少对 OSS 的请求次数。

进入阿里云CDN缓存配置页面,设置默认缓存时间,也可以添加自定义缓存规则,针对不同的文件类型设置不同的缓存时间。

2. 流量控制

配置 CDN 的流量控制,比如限制单个 IP 的请求速率,防止恶意下载攻击。

进入阿里云 CDN 流量控制设置,设置请求速率限制,选择“请求源 IP”作为匹配条件,设置允许的请求速率,定义响应方式。

3. HTTPS 加速

在阿里云 CDN 上配置 HTTPS 加速需要为 CDN 加速域名申请并配置 SSL 证书。目的是为了确保文件传输的安全性。

  1. 申请 SSL 证书
    登录阿里云控制台:访问阿里云官网并登录阿里云账号。
    进入证书管理控制台:在控制台首页,搜索并选择“证书管理”服务,或在“产品与服务”中找到“安全”下的“证书管理”。
    购买证书:在证书管理页面,点击“购买证书”,选择适合你的 SSL 证书类型(如 DV、OV 或 EV 证书)。根据提示填写申请信息,并完成支付。
    完成验证:根据所选证书类型,进行域名验证。通常需要通过邮箱验证、DNS 验证等方式确认你对域名的所有权。
    生成证书:验证通过后,证书会被生成,并可在证书管理控制台下载。

  2. 配置 CDN 加速域名 HTTPS
    进入 CDN 控制台:在阿里云控制台,搜索并选择“CDN”服务。
    选择加速域名:在 CDN 控制台中,找到你的加速域名,点击该域名进入详细配置页面。
    开启 HTTPS 加速:在加速域名的配置页面中,找到“HTTPS 加速”或“SSL 证书”设置。点击“修改”,选择“自有证书”,然后选择你在证书管理中申请的 SSL 证书。
    上传证书:根据提示上传你下载的 SSL 证书文件和私钥文件。确保文件格式正确(通常为 PEM 格式)。填写相关证书信息,如证书名称等。
    配置其他 HTTPS 选项(可选):配置 HTTPS 的相关选项,如 HTTPS 强制访问、TLS 版本等。
    保存并生效:完成以上设置后,保存配置。通常配置生效需要一些时间(几分钟到几十分钟不等)。

  3. 测试 HTTPS 访问
    访问加速域名:在浏览器中输入你的 CDN 加速域名,确保能够通过 HTTPS 访问。检查 SSL 证书是否正确安装,并且未出现安全警告。
    检查证书信息:点击浏览器地址栏的锁形图标,查看证书信息,确保证书是有效的。

  4. 配置强安全的TLS设置
    在 CDN 上配置强安全的 TLS 设置,禁用过时的协议和弱加密算法,以提高安全性。具体步骤如下:

  • 配置 TLS 版本

    • TLS 1.2:推荐使用。
    • TLS 1.3:更安全,但要确保所有用户的客户端支持此协议。
  • 禁用过时协议

    • 确保禁用 TLS 1.0 和 TLS 1.1,因这两个协议已经被认为不再安全。
  • 配置加密算法

  • 选择安全性更高的加密套件,如:

    • ECDHE-RSA-AES256-GCM-SHA384
    • ECDHE-RSA-AES128-GCM-SHA256
  • 禁用已知的不安全加密算法,例如:

    • RC4
    • 3DES
    • DES
    • MD5 等。
  1. 注意事项
    证书有效期:定期检查证书的有效期,确保在到期前续费或重新申请新的证书。
    缓存策略:在配置 HTTPS 访问时,注意 CDN 的缓存策略,确保 HTTPS 内容能够被正确缓存和访问。

7. 工作流程

  1. 文件上传到 OSS:用户通过 Spring Boot 项目的文件上传接口,将文件上传到阿里云 OSS。
  2. CDN 加速访问:文件上传成功后,返回一个经过 CDN 加速的访问链接,该链接指向 CDN 的加速域名(如 https://cdn.example.com/yourfile.jpg)。
  3. CDN 缓存机制:当用户请求该文件时,CDN 会从最近的边缘节点提供文件。如果边缘节点没有缓存该文件,CDN 会请求 OSS 源站获取文件并缓存到节点,以加速后续用户的访问。
  4. 优化文件访问速度:由于 CDN 具有全球分布的节点,用户访问时可以从离自己最近的节点获取文件,减少延迟并提升下载速度。

8. 关键点总结

  1. OSS 存储文件:阿里云 OSS 用于存储大文件,支持高可靠的存储和管理。
  2. CDN 加速:阿里云 CDN 将文件分发到全球的边缘节点,加速访问,减少延迟。
  3. 返回 CDN 链接:在 Spring Boot 项目中上传文件后,返回经过 CDN 加速的访问链接,提高用户访问速度。
  4. 异步上传和下载:主启动配置启动异步注解@EnableAsync,避免阻塞主线程,提升用户体验。

9. 优化建议

  • 缓存配置:针对不同类型的文件设置合适的 CDN 缓存时间。大文件一般设置较长的缓存时间,减少对 OSS 的直接请求次数。
  • 安全配置:为 CDN 配置 HTTPS 访问和防盗链机制,确保文件的安全性,防止未经授权的访问。
  • 带宽控制:在高并发情况下,可以启用带宽限制和流量监控,防止因大量请求导致带宽超载。

通过将阿里云 OSS 与 CDN 结合,可以显著提高大文件的分发和访问速度,提升用户体验并优化系统性能。

8. 总结

  1. 通过阿里云OSS实现文件存储;
  2. 使用分片上传来提升大文件上传效率;
  3. 可使用CDN加速文件读取;
  4. 通过OSS提供的多线程或异步处理提升并发读写效率。
阿里云 OSS 提供了多种方式进行文件批量上传,以下是其中两种常用的方式: 1. 使用 OSS 官方提供的 OSSImport 工具进行批量上传 OSSImport 工具是阿里云 OSS 官方提供的一个命令行工具,可以帮助用户快速、简单、安全地将本地文件批量上传到 OSS 中。使用 OSSImport 工具进行文件批量上传的步骤如下: - 下载并安装 OSSImport 工具 - 创建一个 CSV 文件,列出要上传的文件路径及其对应的 OSS 对象路径 - 在命令行中执行以下命令进行批量上传: ``` ossimport --endpoint your-endpoint --accessKeyId your-accessKeyId --accessKeySecret your-accessKeySecret --bucket your-bucket --inputFormat CSV --file your-csv-file.csv --batchSize 10 ``` 其中,`your-endpoint`、`your-accessKeyId`、`your-accessKeySecret`、`your-bucket`、`your-csv-file.csv` 需要根据实际情况进行替换。 2. 使用阿里云 OSS Java SDK 进行批量上传 阿里云 Java SDK 提供了丰富的 API 来操作 OSS,使用 SDK 可以方便地将本地文件批量上传到 OSS 中。以下是使用 Java SDK 进行批量上传的示例代码: ```java public static void main(String[] args) { String endpoint = "your-endpoint"; // OSS 的访问域名 String accessKeyId = "your-access-key-id"; // 访问 OSS 的 accessKeyId String accessKeySecret = "your-access-key-secret"; // 访问 OSS 的 accessKeySecret String bucketName = "your-bucket-name"; // OSS 的 bucket 名称 String directory = "your-directory"; // 要上传的本地目录,如:/tmp/ // 创建 OSSClient 实例 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 获取本地目录下的所有文件 File dir = new File(directory); File[] files = dir.listFiles(); // 批量上传 List<String> uploadUrls = new ArrayList<>(); for (File file : files) { String objectName = file.getName(); ossClient.putObject(bucketName, objectName, file); String uploadUrl = "https://" + bucketName + "." + endpoint + "/" + objectName; uploadUrls.add(uploadUrl); } // 输出上传成功的文件 URL System.out.println("Upload success:"); for (String url : uploadUrls) { System.out.println(url); } // 关闭 OSSClient ossClient.shutdown(); } ``` 在上面的示例代码中,我们首先创建了一个 OSSClient 实例,然后获取 directory 目录下的所有文件,并使用 putObject 方法将文件上传到 OSS 中,最后输出上传成功的文件 URL。 需要注意的是,使用 Java SDK 进行文件批量上传时,需要保证文件大小不超过 5GB,同时上传速度受网络环境和文件大小等因素影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值