基于php实现七牛抓取远程图片

yizhihongxing

基于PHP实现七牛抓取远程图片的攻略如下:

一、安装七牛SDK

要使用PHP代码操作七牛云存储,需要先安装相关SDK,在这里我们使用qiniu/php-sdk这个官方提供的SDK,使用composer安装即可。

composer require qiniu/php-sdk

二、申请AK/SK

申请过程不细讲,可以参考七牛云文档。

三、编写代码

实现流程

  1. 获取远程图片URL和要存储到的七牛bucket和key
  2. 获取远程图片内容
  3. 创建一个七牛服务对象
  4. 上传图片到七牛

以下是基于魔术方法的一个示例实现:

<?php

require_once __DIR__ . '/vendor/autoload.php';

# AK&SK
$accessKey = '<Your Access Key>';
$secretKey = '<Your Secret Key>';

# 要抓取的远程文件 URL
$fileUrl = 'http://www.example.com/remote.jpg';

# 存储到七牛后的文件名及路径
$key = 'my-prefix/some/path/file-name.jpg';

# 七牛配置
$config = new \Qiniu\Config();
$config->useHTTPS = true;

# 构建七牛服务对象
$qiniu = new \Qiniu\Storage\UploadManager($config);

# 抓取远程文件
list($fileContents) = \Qiniu\Utils\HttpManager::requestWithoutAuth($fileUrl);

# 上传到七牛存储
list($ret, $err) = $qiniu->put($token, $key, $fileContents);

if ($err !== null) {
    echo sprintf("qiniu-sdk error: %s\n", $err->getMessage());
} else {
    echo sprintf("success: http://%s/%s\n", $config->getUpHost(), $ret['key']);
}

如何使用

在上面的代码示例中,需要填写七牛AK和SK,$fileUrl表示要抓取的远程图片URL,$key是上传到七牛的文件名及路径。其余的代码无需修改,直接运行即可实现抓取远程图片并上传到七牛。

四、优化实现

实际上,上面的文件上传代码还是有问题的,因为抓取远程图片的过程可能会比较耗时,这会导致后面的文件上传操作可能会出现超时等问题。一个更好的解决方案是使用PHP协程进行异步编程,代码如下:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use function GuzzleHttp\Promise\coroutine;

# AK&SK
$accessKey = '<Your Access Key>';
$secretKey = '<Your Secret Key>';

# 要抓取的远程文件 URL
$fileUrl = 'http://www.example.com/remote.jpg';

# 存储到七牛后的文件名及路径
$key = 'my-prefix/some/path/file-name.jpg';

# 七牛配置
$config = new \Qiniu\Config();
$config->useHTTPS = true;

# 构建七牛服务对象
$qiniu = new \Qiniu\Storage\UploadManager($config);

# GuzzleHttp 请求客户端
$httpClient = new Client();

coroutine(function () use ($qiniu, $httpClient, $fileUrl, $key) {

    # 抓取远程文件
    $downloadPromise = $httpClient->getAsync($fileUrl)->then(function ($response) {
        return $response->getBody()->getContents();
    });

    # 存储到七牛
    $uploadPromise = $downloadPromise->then(function ($fileContents) use ($qiniu, $key) {
        list($ret, $err) = $qiniu->put(null, $key, $fileContents);
        if ($err !== null) {
            echo sprintf("qiniu-sdk error: %s\n", $err->getMessage());
        } else {
            echo sprintf("success: http://%s/%s\n", $config->getUpHost(), $ret['key']);
        }
    });

    yield $uploadPromise;
});

以上示例代码中,将抓取远程文件和上传到七牛存储的过程异步执行,这样不会阻塞其他操作,文件上传操作也不存在超时等问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于php实现七牛抓取远程图片 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • php安装php_rar扩展实现rar文件读取和解压的方法

    安装php_rar扩展可以实现rar文件读取和解压缩。具体步骤如下: 步骤1:确认环境 首先需要确认操作系统及PHP版本。php_rar扩展提供了Linux和Windows版本,同时支持PHP5和PHP7,所以需要根据实际情况选择对应的版本。 步骤2:下载安装文件 下载对应版本的php_rar扩展,可以到官网https://pecl.php.net/pack…

    PHP 2023年5月26日
    00
  • PHP给源代码加密的几种方法汇总(推荐)

    首先,将PHP源代码加密是为了保护代码的安全性,防止恶意攻击者盗取和篡改代码。本文将介绍几种常用的PHP源代码加密方法。 1. 使用Zend Guard加密 Zend Guard是PHP官方提供的源代码加密软件,可以将PHP源代码转换为优化过的字节码,并与Zend的运行时环境一起使用。使用Zend Guard加密PHP源代码需要购买Zend Studio或Z…

    PHP 2023年5月23日
    00
  • php小技巧之过滤ascii控制字符

    PHP小技巧之过滤ASCII控制字符 前言 在编写PHP代码时,为了保证程序安全性和健壮性,通常需要对用户提交的数据进行过滤和验证。而其中比较常见的需求之一就是过滤ASCII控制字符。 ASCII控制字符是指ASCII字符集中的0-31和127号字符,包括换行符、回车符、制表符等不可见字符和控制字符。这些字符在页面中显示出来通常没有意义,而且可能会对代码的安…

    PHP 2023年5月26日
    00
  • 在Windows系统下怎么部署PHP网站运行环境?

    部署PHP网站运行环境需要进行以下步骤: 1. 安装Web服务器 在Windows系统下,最常见的Web服务器是IIS和Apache。IIS是Windows自带的Web服务器,并且已经被集成到Windows Server中。如果你使用的是Windows Desktop,那么就需要手动安装IIS。在控制面板中找到程序和功能,选择启用或关闭Windows功能,然…

    PHP 2023年5月24日
    00
  • 小文件php+SQLite存储方案

    小文件PHP+SQLite存储方案是一种轻量、高效的数据存储方案,它利用PHP语言和SQLite数据库技术,可以快速地在Web应用程序中存储和管理小型文件(如图片、文本、音视频、JSON数据等)。 下面是一个完整的小文件PHP+SQLite存储方案攻略: 步骤一:搭建SQLite数据库和PHP环境 首先,我们需要在本地或Web服务器上搭建SQLite数据库和…

    PHP 2023年5月26日
    00
  • php动态生成函数示例

    下面是针对“PHP动态生成函数示例”的完整攻略,包括了两个示例说明。 什么是PHP动态生成函数 在PHP中,我们可以使用动态生成函数(Dynamic Function)的方式定义函数。动态生成函数的特点是:我们不需要在代码中预定义函数,而是可以根据需要,在运行时动态地创建函数。在生成函数的时候,需要给出函数名和函数体的字符串。 示例 1:使用eval函数动态…

    PHP 2023年5月25日
    00
  • PHP中each与list用法分析

    PHP中each与list用法分析 each() 和 list() 都是 PHP 中用于处理数组的函数。each() 用于返回数组中的键和值,而 list() 则用于将数组中的值赋到一组变量中。在使用这两个函数时,必须清楚它们的用法和限制。 each()函数 语法 each(array $array): array|false 参数 $array:必需。规定…

    PHP 2023年5月26日
    00
  • php获取远程文件内容的函数

    下面是关于”PHP获取远程文件内容的函数”的详细讲解。 什么是PHP获取远程文件内容的函数? 在PHP中,我们可以使用一些函数来获取远程文件的内容。这些函数可以通过网络协议来获取内容,例如HTTP,FTP等。 PHP获取远程文件内容的函数 file_get_contents($url) 这个函数使用最简单,获取远程文件内容的代码只需要一句,就是file_ge…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部