出现错误 - 无法打开流:找不到合适的包装器

问题描述 投票:0回答:1

其他类似的帖子没有修复这个错误。 使用Codeigniter和Openai API生成图像。 服务器迁移后开始出现此错误。 现在它只是将 0 字节的 img 文件放在服务器上并抛出此错误。 之前是3MB的图片,不是很大。

A PHP Error was encountered
Severity: Warning
Message: file_get_contents(https://oaidalleapiprodscus.blob.core.windows.net/private/org-vsNFQNxeX6XH5mkcucSgjmwr/user-xrjvRzlnKwWRfjibOKWJRpd6/img-3VQ4qjdmWfizq6mWRGRl7TgI.png?st=2024-09-28T13%3A24%3A34Z&se=2024-09-28T15%3A24%3A34Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=d505667d-d6c1-4a0a-bac7-5c84a87759f8&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-09-28T00%3A48%3A37Z&ske=2024-09-29T00%3A48%3A37Z&sks=b&skv=2024-08-04&sig=6zC7Ix2wBA3L1Bn9OYW%2BeE%2BX5svP0AsRjm%2BTe%2BbobNo%3D): failed to open stream: no suitable wrapper could be found
Filename: controllers/Images.php
Line Number: 599
Backtrace:
File: /home/rztxdnnj/public_html/app/application/controllers/Images.php
Line: 599
Function: file_get_contents
File: /home/rztxdnnj/public_html/app/index.php
Line: 316
Function: require_once

尝试图像链接,它的工作

allow_url_fopen 和 file_get_contents 已开启

图像.php:

  public function ai_image_generator(){
        $keys_words = '';
        if(isset($_POST['key_words'])):
        $keys_words = html_escape($_POST['key_words']);
        endif;
        $image_size = '';
        if(isset($_POST['image_size'])):
        $image_size = html_escape($_POST['image_size']);
        endif;
        $ogj = str_replace(" ","%20",$keys_words);
        if(!empty($image_size)){
            $size = $image_size;
        }else{
            $size = "1024x1024";
        }
        if(!empty($ogj)){
            $args = array(
                "prompt" => $ogj,
                "n"=>1,
                "size"=>$size,
                'model'  => 'dall-e-3'
            );

        $data_string = json_encode($args);
        $ch = curl_init('https://api.openai.com/v1/images/generations');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer '.AI_IMAGES_CODE
        'Content-Type: application/json'
        ));
        $result = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
        $a = json_decode($result,true);
            if(isset($a['data'])){
                foreach($a['data'] as $a_child){
                    $image_path = 'openai_images'.rand(10,100);
                    $img = 'uploads/ai/'.$image_path.'.png';
                    $imgUrl = $a_child['url'];
                    file_put_contents($img, file_get_contents($imgUrl));
                    $img_url= base_url().'/uploads/ai/'.$image_path.'.png';
                    echo '<div data-url="'.$img_url.'"><img src="'.$img_url.'" alt="AI IMAGES"></div>';
                }
            }else{
                echo '<p>'.esc_html($a['error']['message']).'</p>';
            }
        }else{
            echo '<p>'.esc_html__('Please Enter Object Name.','gpt-blaster').'</p>';
        }


      die();
    }

我不拥有服务器,我不确定他们做了什么或根本没有做任何事情来解决这个问题。但可以肯定的是,allow_url_fopen 和 file_get_contents 已打开。

php codeigniter openai-api
1个回答
0
投票

您遇到的错误消息表明使用

file_get_contents
从 URL 检索图像时存在问题,即使您已确认
allow_url_fopen
已启用且 URL 可访问。出现此问题的原因有多种,尤其是在服务器迁移之后。以下是可能的解决方案和故障排除步骤的全面细分:

1. 验证 PHP 配置和服务器环境

即使启用了

allow_url_fopen
,也可能存在其他服务器配置问题:

  • PHP 版本兼容性: 确保新服务器上的 PHP 版本与您的代码库兼容。某些函数和特性在 PHP 版本之间可能表现不同。
  • SSL 配置: 如果服务器的 SSL 配置未正确设置,可能会导致
    file_get_contents
    访问 HTTPS URL 时失败。检查服务器是否有必要的 SSL 证书和配置。
  • 防火墙或安全设置: 某些服务器可能具有阻止外部 HTTP/HTTPS 请求的防火墙规则或安全设置。与您的托管提供商核实是否有任何此类限制。

2. 切换到 cURL 进行远程文件访问

虽然

file_get_contents
很方便,但使用 cURL 通常更健壮,并提供更好的错误处理。由于 cURL 已在您的代码中使用,因此您可以修改图像下载部分以也使用 cURL。

以下是更新代码以使用 cURL 下载图像的方法:

function downloadImage($url, $path) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Only disable verification if absolutely necessary
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // Only disable verification if absolutely necessary

    $data = curl_exec($ch);
    if (curl_errno($ch)) {
        throw new Exception('Error: ' . curl_error($ch));
    }

    curl_close($ch);

    // Save the image file
    file_put_contents($path, $data);
}

public function ai_image_generator(){
    // Existing code...
    if (isset($a['data'])) {
        foreach ($a['data'] as $a_child) {
            $image_path = 'openai_images' . rand(10, 100);
            $img = 'uploads/ai/' . $image_path . '.png';
            $imgUrl = $a_child['url'];

            try {
                downloadImage($imgUrl, $img);
                $img_url = base_url() . '/uploads/ai/' . $image_path . '.png';
                echo '<div data-url="' . $img_url . '"><img src="' . $img_url . '" alt="AI IMAGES"></div>';
            } catch (Exception $e) {
                echo '<p>Error downloading image: ' . $e->getMessage() . '</p>';
            }
        }
    } else {
        echo '<p>' . esc_html($a['error']['message']) . '</p>';
    }
    // Existing code...
}

3. 检查文件系统权限

确保保存图像的目录 (

uploads/ai/
) 具有正确的权限设置,允许 Web 服务器写入文件。通常,将目录权限设置为
755
775
就足够了,但这取决于您的服务器配置。

4. 网络或 DNS 问题

验证服务器上是否存在可能影响对外部 URL 的传出请求的任何 DNS 问题或网络限制。这可以通过从服务器运行网络诊断来检查。

5. 错误记录

在 PHP 中启用详细错误日志记录,以捕获基本错误消息中可能不明显的任何潜在问题。更新您的

php.ini
或使用
ini_set
配置错误报告:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

结论

按照上述步骤,您应该能够诊断并解决从 OpenAI API 下载图像的问题。切换到 cURL 进行下载并确保正确的服务器配置和权限是解决此问题的关键步骤。如果问题仍然存在,可能需要与您的托管提供商协调特定于服务器的配置和限制。

© www.soinside.com 2019 - 2024. All rights reserved.