分类目录归档:阿里云

小程序上传图片or文件到阿里云OSS

搞了大半天,累死了,原本在阿里云官网通过后台取签上传的方式,前端会用到lib,例子下载后无法加入到小程序中使用,后来在CSDN的一篇博文里找到了解决方案

后端get.php,callback.php从阿里云例子中取,直接用

get.php代码

<?php
    function gmt_iso8601($time) {
        $dtStr = date("c", $time);
        $mydatetime = new DateTime($dtStr);
        $expiration = $mydatetime->format(DateTime::ISO8601);
        $pos = strpos($expiration, '+');
        $expiration = substr($expiration, 0, $pos);
        return $expiration."Z";
    }

    $id= 'xxxxxxxx';          // 请填写您的AccessKeyId。
    $key= 'xxxxxxxx';     // 请填写您的AccessKeySecret。
    // $host的格式为 bucketname.endpoint,请替换为您的真实信息。
    $host = 'https://bucket名称.oss-cn-地域.aliyuncs.com/';  
    // $callbackUrl为上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实URL信息。
    $callbackUrl = 'callback.php的网络路径';
    $dir = '文件保存路径';          // 用户上传文件时指定的前缀。
	
    $callback_param = array('callbackUrl'=>$callbackUrl, 
                 'callbackBody'=>'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}', 
                 'callbackBodyType'=>"application/x-www-form-urlencoded");
    $callback_string = json_encode($callback_param);

    $base64_callback_body = base64_encode($callback_string);
    $now = time();
    $expire = 30;  //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问。
    $end = $now + $expire;
    $expiration = gmt_iso8601($end);


    //最大文件大小.用户可以自己设置
    $condition = array(0=>'content-length-range', 1=>0, 2=>1048576000);
    $conditions[] = $condition; 

    // 表示用户上传的数据,必须是以$dir开始,不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录。
    $start = array(0=>'starts-with', 1=>'$key', 2=>$dir);
    $conditions[] = $start; 


    $arr = array('expiration'=>$expiration,'conditions'=>$conditions);
    $policy = json_encode($arr);
    $base64_policy = base64_encode($policy);
    $string_to_sign = $base64_policy;
    $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));

    $response = array();
    $response['accessid'] = $id;
    $response['host'] = $host;
    $response['policy'] = $base64_policy;
    $response['signature'] = $signature;
    $response['expire'] = $end;
    $response['callback'] = $base64_callback_body;
    $response['dir'] = $dir;  // 这个参数是设置用户上传文件时指定的前缀。
    echo json_encode($response);
?>

callback.php不用改

小程序前端:

uploadAliyun(str){   //str是wx.chooseImage返回的res.tempFilePaths[0]
  var that = this;
  wx.uploadFile({
    url: 'xxxx/get.php', //你的服务器地址
    filePath: str, //要上传文件资源的路径
    name: 'headimg', //文件对应的 key,开发者在服务端可以通过这个 key 获取文件的二进制内容
    formData: {
	adminid: app.globalData.adminid  //HTTP 请求中其他额外的参数比如 用户id
    },
    success(res) {
        console.log(res)
        if(res.statusCode == 200){
          var info = JSON.parse(res.data);
          //  随机生成文件名称
          var fileRandName = Date.now() + "" + parseInt(Math.random() * 1000)
          var fileName = fileRandName + '.' + that.get_suffix(str)
          wx.uploadFile({
            url: 'https://bucket名称.oss-cn-地域.aliyuncs.com', 
            filePath: str,
            name: 'file',
            formData: {
              name: str,
              key: info.dir + fileName,
              policy: info.policy,
              signature: info.signature,
              expire : info.expire,
              success_action_status: "200",
              host: info.host,
              OSSAccessKeyId : info.accessid
            },
            success: function (res) {
              var data = res.data
              console.log(res)
              if(res.statusCode == 200){ }
            }
          })
        }
    }
   })
  },

补充get_suffix功能函数

get_suffix: function(filename) {
    var pos = filename.lastIndexOf('.')
    var suffix = ''
    if (pos != -1) {
        suffix = filename.substring(pos)
    }
    return suffix;
  },

ICP备案后网站添加备案号

ICP备案成功后,在网站开通时您需编辑网页源代码,将工信部下发的主体备案号或网站备案号放置在网页底部,并要求主体或网站备案号能够链接至工信部网站:beian.miit.gov.cn。

如果未在网站底部添加备案号,被相关部门核查出来将处以五千元以上一万元以下罚款。以下以阿里云PC端官网为例,示例网站添加备案号后的效果。

原文:https://help.aliyun.com/document_detail/146190.html

使用PHP阿里云OSS上传文件

1.安装PHP

http://windows.php.net/download/,安装5.6+的PHP环境,我使用的php-7.4.9-nts-Win32-vc15-x64,解压后把ext目录下的php_curl.dll复制到C:/Windows/System32下,在php.ini中取消掉extension=curl前面的分号注释。

我的电脑右击选择属性,然后按照高级系统设置 -> 高级 -> 环境变量,进入环境变量属性页,在系统变量中把%PHP_INSTALL_DIR%/php-7.4.9-nts-Win32-vc15-x64加入Path。

在Dos命令行中输入命令php -v,如果显示PHP的版本号,说明安装成功。

2.安装composer

下载composer。打开https://getcomposer.org/download/,从Manual Download中下载当前最新版本1.1.2。下载到本地的文件是composer.phar。

把composer.phar复制到%PHP_INSTALL_DIR%/php-7.4.9-nts-Win32-vc15-x64,并在php-7.4.9-nts-Win32-vc15-x64目录下创建文本文件composer.bat,添加如下内容:

@php %~dp0composer.phar %*

在DOS命令行中执行命令composer --version,如果显示composer的版本号,说明安装成功。

在DOS命令行窗中执行如下命令配置composer:

composer config -g disable-tls true
composer config -g secure-http false
composer config -g repositories.packagist composer http://packagist.phpcomposer.com

3.安装phar-composer

下载phar-composer。打开https://github.com/clue/phar-composer,在DOS命令行中进入代码目录phar-composer-master,执行命令composer install。然后执行命令php -d phar.readonly=off bin/phar-composer build,完成后会生成phar-composer.phar。

把phar-composer.phar复制到%PHP_INSTALL_DIR%/php-7.4.9-nts-Win32-vc15-x64,并在php-7.4.9-nts-Win32-vc15-x64目录下创建文本文件phar-composer.bat,添加如下内容:

@php %~dp0phar-composer.phar %*

在DOS命令行中执行命令phar-composer --version,如果显示phar-composer的版本号,说明安装成功。(见下图)

4.编译OSS PHP SDK

打开https://github.com/aliyun/aliyun-oss-php-sdk,下载解压到目录aliyun(可自行重命名),在DOS命令行进入代码目录aliyun,执行命令composer install下载依赖包。然后执行命令
php -d phar.readonly=off %PHP_INSTALL_DIR%/php-5.6.22-Win32-VC11-x64/phar-composer.phar build . aliyun-oss-php-sdk.phar,完成后会生成OSS PHP SDK包aliyun-oss-php-sdk.phar。

5.运行OSS PHP SDK测试程序

<?php
require_once 'aliyun-oss-php-sdk.phar';

use OSS\OssClient;
use OSS\Core\OssException;

//参考https://developer.aliyun.com/ask/2061的endpoint列表
$endpoint = "http://oss-cn-beijing.aliyuncs.com";  // http://oss-cn-hangzhou.aliyuncs.com
$accessKeyId = "在OSS控制台获取";
$accessKeySecret = "在OSS控制台获取";
$bucket = "你的bucket名字";
    
try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    
    // list bucket
    $bucketListInfo = $ossClient->listBuckets();
    $bucketList = $bucketListInfo->getBucketList();
    print("bucketList:\n");
    foreach($bucketList as $buck) {
        print($buck->getLocation() . "\t" . $buck->getName() . "\t" . $buck->getCreatedate() . "\n");
    }
    
    // list objects
    $options = array();
    $listObjectInfo = $ossClient->listObjects($bucket, $options);
    $objectList = $listObjectInfo->getObjectList();
    if (!empty($objectList)) {
        print("objectList:\n");
        foreach ($objectList as $objectInfo) {
            print($objectInfo->getKey() . "\t" . $objectInfo->getSize() . "\t" . $objectInfo->getLastModified() . "\n");
        }
    }
    
    // put object
    $object = "php-test-key";
    $content = "Hello, OSS!";
    $ossClient->putObject($bucket, $object, $content);
    
    // get object
    $content = $ossClient->getObject($bucket, $object);
    print("key is fetched, the content is: " . $content);
    
    // delete object
    $ossClient->deleteObject($bucket, $object);
} catch (OssException $e) {
    print($e->getMessage() . "\n");
    return;
}
?>

把aliyun-oss-php-sdk.phar复制test_oss.php的同级目录。在DOS命令行进入test.php,执行命令php test.php运行测试程序,成果结果如下:

6.上传图片

<?php
require_once 'aliyun-oss-php-sdk.phar';

use OSS\OssClient;
use OSS\Core\OssException;

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
$endpoint = "http://oss-cn-beijing.aliyuncs.com";  // http://oss-cn-hangzhou.aliyuncs.com
$accessKeyId = "OSS控制台获取";
$accessKeySecret = "OSS控制台获取";
$bucket = "你的bucket名";
// 设置文件名称。
$object = "head/pic1.png"; //包括文件夹的目的路径
// <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
$filePath = "I:\www\sanguo\aliyun\coffe.png"; //源文件本地路径

try{
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

    $ossClient->uploadFile($bucket, $object, $filePath);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}
print(__FUNCTION__ . ": OK" . "\n");

在DOS命令行进入upfile.php,执行命令php upfile.php运行测试程序,成功结果如下:

可以在OSS控制台看到图片上传成功。

参考:Windows下编译使用Aliyun OSS PHP SDK
安装 OSS PHP SDK
OSS PHP简单上传
OSS开通Region和Endpoint对照表