惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
Hacker News: Ask HN
Hacker News: Ask HN
T
Threatpost
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 【当耐特】
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
S
SegmentFault 最新的问题
月光博客
月光博客
Latest news
Latest news
博客园 - Franky
T
Threat Research - Cisco Blogs
有赞技术团队
有赞技术团队
博客园_首页
T
The Exploit Database - CXSecurity.com
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
S
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
爱范儿
爱范儿
Security Latest
Security Latest
Scott Helme
Scott Helme
博客园 - 聂微东
T
Tor Project blog
美团技术团队
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
G
Google Developers Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
AWS News Blog
AWS News Blog
Jina AI
Jina AI
Vercel News
Vercel News
小众软件
小众软件
T
Tenable Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Forbes - Security
Forbes - Security
aimingoo的专栏
aimingoo的专栏
O
OpenAI News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Last Watchdog
The Last Watchdog
Cloudbric
Cloudbric
AI
AI

博客园 - 天心PHP

去除文件夹下面所有xlsx的样式脚本 php 上传视频到阿里云OSS (不用SDK) 升级版本 断点续传 SHEIN 开放平台授权 mercadolibre 美卡多 拉取listing Amazon SP API批量更新价格 JSON_LISTINGS_FEED Allegro API接口 Ozon API接口 Wildberries API接口 沃尔玛拉取listing和库存 沃尔玛修改促销价格 Amazon SP API 拉取产品详情和修改产品属性 Amazon SP API拉取分类,五点,描述和关键字 Amazon SP API拉取日期范围报告和分类树 PHP 提取PDF文件内容 常用sql(1.分组取最新的 N 条数据; 2.删除重复数据 ) kaufland平台api mercadolibre 美卡多 本土授权(PKCE) go mod Amazon SP API拉取listing 和 批量调价
php 上传视频到阿里云OSS (不用SDK)
天心PHP · 2025-09-15 · via 博客园 - 天心PHP

2025-09-15 14:08  天心PHP  阅读(37)  评论()    收藏  举报

/**
 * 阿里云OSS视频上传类(不使用SDK)
 */
class AliyunOSSUploader
{
    private $accessKeyId;
    private $accessKeySecret;
    private $bucket;
    private $endpoint;

    public function __construct() {
        $this->accessKeyId = '您的AccessKey ID';
        $this->accessKeySecret = '您的AccessKey Secret';
        $this->bucket = '您的Bucket名称';
        $this->endpoint = '您的endpoint';
    }

    /**
     * 生成签名
     */
    private function sign($stringToSign) {
        return base64_encode(hash_hmac('sha1', $stringToSign, $this->accessKeySecret, true));
    }

    /**
     * 生成GMT时间
     */
    private function gmtDate() {
        return gmdate('D, d M Y H:i:s') . ' GMT';
    }

    /**
     * 上传文件
     */
    public function uploadFile($file_path,$file_type, $oss_path) {
        // 读取文件内容
        $content = file_get_contents($file_path);
        $file_size = filesize($file_path);

        // 生成请求头
        $date = $this->gmtDate();
        $content_type = $this->getMimeTypeNew($file_type);

        // 生成签名字符串
        $sign_string = "PUT\n\n" . $content_type . "\n" . $date . "\n/" . $this->bucket . '/' . $oss_path;

        $signature = $this->sign($sign_string);

        // 构建请求头
        $headers = array(
            'Host: ' . $this->bucket . '.' . $this->endpoint,
            'Date: ' . $date,
            'Content-Type: ' . $content_type,
            'Content-Disposition: ' . 'inline',
            'Content-Length: ' . $file_size,
            'Authorization: OSS ' . $this->accessKeyId . ':' . $signature
        );

        // 构建URL
        $url = 'http://' . $this->bucket . '.' . $this->endpoint . '/' . $oss_path;

        // 发送PUT请求
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_PUT, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_INFILE, fopen($file_path, 'r'));
        curl_setopt($ch, CURLOPT_INFILESIZE, $file_size);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return array('code'=>$http_code,'url'=>$url,'response'=>$response);
    }

    /**
     * 删除视频
     */
    public function deleteOssObject($object) {
        // 构造URL
        $url = "https://{$this->bucket}.{$this->endpoint}/" . ($object);
        // 生成日期时间(GMT格式)
        $date = $this->gmtDate();
        // 构造签名字符串
        $sign_string = "DELETE\n\n\n{$date}\n/{$this->bucket}/{$object}";
        // 计算签名(使用HMAC-SHA1)
        //$signature = base64_encode(hash_hmac('sha1', $sign_string, $this->accessKeySecret, true));
        $signature = $this->sign($sign_string);
        // 构造Authorization头
        $authorization = "OSS {$this->accessKeyId}:{$signature}";
        // 初始化cURL
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            "Date: {$date}",
            "Authorization: {$authorization}"
        ]);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        // 执行请求
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        curl_close($ch);

        // 检查响应
        if ($httpCode == 204) {
            return true; // 删除成功
        } else {
            return "删除失败,HTTP状态码: {$httpCode},响应: {$response}";
        }
    }

    /**
     * 获取文件MIME类型
     */
    private function getMimeType($filename) {
        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
        $mime_types = array(
            'mp4' => 'video/mp4',
            'avi' => 'video/x-msvideo',
            'mov' => 'video/quicktime',
            'wmv' => 'video/x-ms-wmv',
            'flv' => 'video/x-flv',
            'webm' => 'video/webm',
            // 添加更多类型...
        );

        return isset($mime_types[$ext]) ? $mime_types[$ext] : 'application/octet-stream';
    }

    private function getMimeTypeNew($filename) {
        $mime_types = array(
            'video/mp4' => 'video/mp4',
            'video/x-msvideo' => 'video/x-msvideo',
            'video/quicktime' => 'video/quicktime',
            'video/x-ms-wmv' => 'video/x-ms-wmv',
            'video/x-flv' => 'video/x-flv',
            'video/webm' => 'video/webm',
            // 添加更多类型...
        );
        return isset($mime_types[$filename]) ? $mime_types[$filename] : 'application/octet-stream';
    }
}

//上传使用案例

<?php
//上传
if ($_FILES && $_FILES['video_file']) {
    $uploader = new AliyunOSSUploader();
    
    $upload_file = $_FILES['video_file'];
    $oss_filename = 'videos/' . date('Ymd') . '/' . uniqid() . '.' . 
                   pathinfo($upload_file['name'], PATHINFO_EXTENSION);
                   
    $res = $uploader->uploadFile($upload_file['tmp_name'],$upload_file['type'], $oss_filename);
    print_r('<pre>');
    print_r($res);
    print_r('</pre>');
    exit(); 
}
?>
<form method="post" enctype="multipart/form-data">
    <input type="file" name="video_file" accept="video/*">
    <input type="submit" value="上传视频">
</form>

//删除

//删除 http://usimage.oss-us-west-1.aliyuncs.com/upload/video/cs111/68c7c6ee7fab4.mp4?1757923068
$uploader = new AliyunOSSUploader(); $fla = $uploader->deleteOssObject('upload/video/cs111/68c7c6ee7fab4.mp4'); print_r('<pre>'); print_r($res); print_r('</pre>'); exit();

 断点续传版本:https://www.cnblogs.com/xiangshihua/p/19293840