REST API 简易指南(PHP)

这一部分将说明如何快速使用PHP向又拍云上创建的服务上传一份文件,通过这个例子,你将学会如何生成签名并调用我们的REST API进行工作。

讲解例子之前,假设你已经注册了又拍云的帐号,并创建了服务,分配了操作员。示例中我们架设使用一下服务和操作员(虚构,请先自行注册和创建又拍云服务):

准备文件

本示例目标是将本地文件 assets/bar.txt 上传到 demobucket 服务,并重命名为 foo.txt。 所以最终的服务端路径是 $uri = '/demobucket/foo.txt'

    $bucketName = 'demobucket';
    //被上传的文件路径
    $filePath = 'assets/bar.txt';
    $fileSize = filesize($filePath);
    //文件上传到服务器的服务端路径
    $serverPath = 'foo.txt';
    $uri = "/$bucketName/$serverPath";

生成签名

示例中使用安全的签名认证,强烈建议你在实际的生产环境中都使用这种方式来调用我们的 API。 上传文件接口需要通过 HTTP PUT 方法调用,签名生成可以参考如下方式:

    //生成签名时间。得到的日期格式如:Thu, 11 Jul 2014 05:34:12 GMT
    $date = gmdate('D, d M Y H:i:s \G\M\T');
    //本示例只上传了文件,所以 HTTP BODY 长度等于文件长度
    $contentLength = $fileSize;
    $sign = md5("PUT&{$uri}&{$date}&{$contentLength}&".md5($operatorPwd));

发送请求

将上一步生成的签名,放到 HTTP 消息头中。如果没有签名或者签名错误,则会导致接口调用失败,服务端会返回 HTTP 状态码 401

格式如下:

    $headers = array(
        "Expect:",
        "Date: ".$date, // header 中使用的时间必须和生成签名的时间相同
        "Authorization: UpYun $operatorName:".$sign
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

完整代码

通过 php curl 发送put请求,调用接口。倘若接口返回的 HTTP 状态码等于200,说明接口调用成功 - CURLOPT_INFILE 设置上传文件的句柄 - CURLOPT_INFILESIZE 设置上传文件大小

最终项目结构如下

/-
 |-assets
   |-bar.txt
 |-upload.php

upload.php完整代码如下:

<?php
    $bucketName   = 'demobucket';
    $operatorName = 'operator';
    $operatorPwd  = 'operatorpassword';

    //被上传的文件路径
    $filePath = 'assets/bar.txt';
    $fileSize = filesize($filePath);
    //文件上传到服务器的服务端路径
    $serverPath = 'foo.txt';
    $uri = "/$bucketName/$serverPath";


    //生成签名时间。得到的日期格式如:Thu, 11 Jul 2014 05:34:12 GMT
    $date = gmdate('D, d M Y H:i:s \G\M\T');
    $sign = md5("PUT&{$uri}&{$date}&{$fileSize}&".md5($operatorPwd));

    $ch = curl_init('http://v0.api.upyun.com' . $uri);

    $headers = array(
        "Expect:",
        "Date: ".$date, // header 中需要使用生成签名的时间
        "Authorization: UpYun $operatorName:".$sign
    );
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_PUT, true);

    $fh = fopen($filePath, 'rb');
    curl_setopt($ch, CURLOPT_INFILE, $fh);
    curl_setopt($ch, CURLOPT_INFILESIZE, $fileSize);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    if(curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
        //"上传成功"

    } else {
        $errorMessage = sprintf("UPYUN API ERROR:%s", $result);
        echo $errorMessage;
    }
    curl_close($ch);

至此,您已经学会了如何基于 PHP,使用又拍云的 HTTP REST API 上传文件了,您可以访问 HTTP REST API 文档 深入学习 REST API 的其他功能和参数。

或者,您也可以前往 资源下载 页面下载我们所提供的 SDK,来加速你的开发流程。