Python 实现下载 OSS 中的文件到本地以及、FFmpeg格式转换、文件上传OSS/删除等操作

一、前言

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。

本文主要介绍对象存储 OSS 的 Python SDK 各种使用场景下的示例代码。

附:阿里云OSS对象存储文档

好文章 记得收藏+点赞+关注额 !!!

---- Nick.Peng


二、初始化 Bucket 类

  • Python SDK 中的大部分操作都是通过 oss2.Serviceoss2.Bucket 这两个类进行的。
    1、oss2.Service类: 用于列举存储空间。
    2、oss2.Bucket类: 用于上传、下载、删除文件以及对存储空间进行各种配置。
    初始化这两个类时,需要指定Endpoint。其中oss2.Service类不支持自定义域名访问。
# -*- coding: utf-8 -*-

import os
import re
import oss2
import json
import msgpack

from configs.celery import app
from configs.dbconfig import DB

# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
# 这里的授权账号可以单独写在env配置文件中
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint这里以北京为例
bucket = oss2.Bucket(auth, 'http://oss-cn-beijing.aliyuncs.com', '<yourBucketName>')


三、下载 OSS 文件到本地

  • 如果出现文件下载失败,请检查 OSS 文件路径是否正确
def dl_file(audio_url):
    """
    从OSS上下载文件到本地temp_audio_file目录,如果指定的本地文件存在会覆盖,不存在则新建
    :param audio_url: 音频地址 转换前url
    """
    file_name = re.search(r'/(\d+\.m4a)', audio_url).group(1)   # 1585882769054.m4a
    # OSS_BUCKET:在阿里云OSS存储对象控制台创建的bucket的名称
    file_url = re.search(r'https://OSS_BUCKET.oss-cn-beijing.aliyuncs.com/(.+)', audio_url).group(1)
    # local_path由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
    local_path = os.path.join(temp_audio_file) + file_name
    bucket.get_object_to_file(file_url, local_path)

    return file_url, local_path


四、给下载的本地文件进行格式转换

def convert_audio(local_path):
    """实现 m4a to mp3"""
    new_path = local_path.replace('m4a', 'mp3')
    # -y 存在文件则覆盖,-loglevel quiet 禁止控制台信息输出
    os.system("ffmpeg -i " + local_path + " " + new_path + " -y -loglevel quiet")

    return new_path
    

五、上传转换后的文件到 OSS

def up_file(mp3_url, new_path):
    """
    上传转换后的文件到OSS
    :param mp3_url: 音频地址 转换后
    :param new_path: 音频本地路径
    """
    try:
        bucket.put_object_from_file(mp3_url, new_path)
        return True
    except:
        traceback.print_exc()


六、删除本地和 OSS 文件

def del_temp_file(paths):
    """删除临时文件"""
    for file in paths:
        os.remove(file)


def del_oss_file(path):
    """删除oss文件"""
    bucket.delete_object(path)
    

七、任务调度集成 Celery 异步

@app.task(base=MyTask, bind=True)
def audio(self, arg):
    try:
        arg = msgpack.unpackb(msgpack.packb(arg), encoding='utf-8')  # msgpack 反序列化
        atd_id = arg.get("atd_id")

        name = db_name(arg.get("pid"))     						# 根据项目id获取数据库名称
        audio_url = get_audio_url(name, attendance_detail_id)   # 获取音频地址
        if 'm4a' not in audio_url:
            return "OK!"

		# 以下为本文主要业务逻辑
        file_url, local_path = dl_file(audio_url)   	# 下载音频
        new_path = convert_audio(local_path)    		# 音频转换
        new_f_url = file_url.split(".")[0] + ".mp3"     # 转换后音频地址
        up_file(new_f_url, new_path)    				# 上传音频
        del_temp_file([local_path, new_path])   		# 删除本地文件
        update_db(name, atd_id)   		# 更新数据库
        del_oss_file(audio_url.split('aliyuncs.com/')[-1])		# 删除 oss 云文件
    except Exception as e:
        raise self.retry(exc=e, countdown=2, max_retries=3)     # 每隔2s重试一次,最多重试3次

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 ThinkPHP6 ,要实现OSS(阿里云对象存储) 文件下载到浏览器,需要使用 OSS SDK。下面是具体的实现步骤: 1. 安装 OSS SDK 使用 Composer 安装 OSS SDK: ``` composer require aliyuncs/oss-sdk-php ``` 2. 在控制器引入 OSS SDK 在控制器引入 OSS SDK: ```php use OSS\OssClient; use OSS\Core\OssException; ``` 3. 定义下载方法 在控制器定义下载方法: ```php public function downloadOssFile() { $accessKeyId = 'yourAccessKeyId'; // 填写阿里云 OSS 的 AccessKeyId $accessKeySecret = 'yourAccessKeySecret'; // 填写阿里云 OSS 的 AccessKeySecret $endpoint = 'yourEndpoint'; // 填写阿里云 OSS 的 endpoint $bucket = 'yourBucket'; // 填写阿里云 OSS 的 bucket 名称 $object = 'yourObject'; // 填写要下载文件OSS 的 object 名称 try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); // 判断要下载文件是否存在 if (!$ossClient->doesObjectExist($bucket, $object)) { throw new OssException('要下载文件不存在!'); } // 获取要下载文件的元信息 $objectMeta = $ossClient->getObjectMeta($bucket, $object); // 设置要下载文件的名称 $filename = '要下载文件的名称'; // 设置要下载文件的内容类型 $contentType = $objectMeta['content_type']; // 设置要下载文件的长度 $contentLength = $objectMeta['content-length']; // 设置要下载文件的内容 $content = $ossClient->getObject($bucket, $object); // 将文件下载方式输出到浏览器 return Response::create($content, '200', [ 'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', 'Content-Disposition' => 'attachment; filename=' . $filename, 'Content-Length' => $contentLength, 'Content-Type' => $contentType, 'Expires' => '0', 'Pragma' => 'public', ])->send(); } catch (OssException $e) { return $e->getMessage(); } } ``` 其,`$accessKeyId`、`$accessKeySecret`、`$endpoint`、`$bucket`、`$object` 都需要替换成自己的阿里云 OSS 的信息。 4. 定义路由 在路由定义路由规则: ```php Route::get('download_oss_file', '控制器名/downloadOssFile'); ``` 其,`download_oss_file` 为路由地址,`控制器名` 为具体的控制器名称。 5. 访问下载链接 在浏览器访问 `http://localhost/download_oss_file` 即可下载 OSS 文件到浏览器

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值