“;PHP警告:fopen(/app/image.jpg):无法打开流:第585”行/app/vendor/google/cloud/src/Storage/StorageObject.PHP中的权限被拒绝;

“;PHP警告:fopen(/app/image.jpg):无法打开流:第585”行/app/vendor/google/cloud/src/Storage/StorageObject.PHP中的权限被拒绝;,php,api,google-cloud-platform,google-cloud-storage,fopen,Php,Api,Google Cloud Platform,Google Cloud Storage,Fopen,我在尝试使用PHP从Google云存储下载文件时遇到了权限问题,该文件使用API方法接收来自应用程序的调用 为了确保这一点,我创建了一个服务帐户,分配了管理员角色,并在创建存储客户机时使用带有此服务帐户密钥的.json文件进行身份验证。然后在调用中,我通过参数传递文件的数据(为了以防万一,我发布了这些数据)和路由,但不管您尝试哪种路由,都会留下相同的错误 影响此方法的我的应用程序代码为: <?php use Silex\Application; use Silex\Provider\Twi

我在尝试使用PHP从Google云存储下载文件时遇到了权限问题,该文件使用API方法接收来自应用程序的调用

为了确保这一点,我创建了一个服务帐户,分配了管理员角色,并在创建存储客户机时使用带有此服务帐户密钥的.json文件进行身份验证。然后在调用中,我通过参数传递文件的数据(为了以防万一,我发布了这些数据)和路由,但不管您尝试哪种路由,都会留下相同的错误

影响此方法的我的应用程序代码为:

<?php
use Silex\Application;
use Silex\Provider\TwigServiceProvider;
use Symfony\Component\HttpFoundation\Request;
use Google\Cloud\Storage\StorageClient;


// Crea la aplicacion de SILEX
$app = new Application();


//Descarga el archivo seleccionado de un siniestro.
$app->get('/download_archivos_siniestro_app', function () use ($app) {

    $ARCH=$_REQUEST['Archivo'];
    $destination=$_REQUEST['Ruta'];


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

    $path = "credenciales.json";
    $keyFile = json_decode(file_get_contents($path), true);
    $projectId = "mi_ID_del_proyecto";

    $storage = new StorageClient($config = ['projectId' => $projectId, $keyFile]);

    $bucketName = "mi_bucket";
    $objectName = $ARCH;

    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $object->downloadToFile(__DIR__ .$destination);

    $respuesta=array();
    $respuesta['status']='0';
    $respuesta['message']='Todo correcto!';
        }
    }
    return $app->json($respuesta);
});


// Funcion para devolver la instancia del PDO
$app['database'] = function () use ($app) {
    // Connect to CloudSQL from App Engine.
    $dsn = getenv('MYSQL_DSN');
    $user = getenv('MYSQL_USER');
    $password = getenv('MYSQL_PASSWORD');
    if (!isset($dsn, $user) || false === $password) {
        throw new Exception('Set MYSQL_DSN, MYSQL_USER, and MYSQL_PASSWORD environment variables');
    }

    $db = new PDO($dsn, $user, $password);

    return $db;
};


// Acepta peticiones JSON
$app->before(function (Request $request) {
    if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {
        $data = json_decode($request->getContent(), true);
        $request->request->replace(is_array($data) ? $data : array());
    }
});

return $app;
?>
完成此调用后,我在控制台日志中收到以下错误:

"PHP message: PHP Warning:  fopen(/app/image.jpg): failed to open stream: Permission denied in /app/vendor/google/cloud/src/Storage/StorageObject.php on line 585"
其他API方法工作正常,错误只是因为无法将您尝试下载的文件放置在任何指定的文件夹中


提前感谢您的帮助。

对于服务帐户
存储管理员
角色将不起作用,您需要一个名为
存储对象管理员
的角色。我知道这令人困惑

额外提示:作为一种最佳实践,您永远不应该向您的服务帐户授予管理员权限。您应该使用
objectCreator
objectViewer
,具体取决于您是否要创建或查看bucket中的文件


在App Engine中,为了存储文件,您应该使用云存储。引述:

如果您的PHP7应用程序需要在运行时读写文件,或者提供电影、图像或其他静态内容等文件,我们建议您使用云存储桶


但是,如果出于特定原因,您需要一个文件以本地磁盘的形式显示,您应该能够将其存储在
/tmp
目录中。您可以在

可能的副本中找到更多信息和代码片段。尝试更改文件夹权限。事实上,通过“部署”应用程序,“应用程序”文件夹是在谷歌云中创建的,我认为我无法访问该文件夹来更改权限。我试图从那个文件夹中指出,但我不能。服务帐户有所有这些角色,因为我不确定该分配给谁,所以我决定将所有相关的角色都分配给测试人员。正如您所说,我已删除除Storage Object Admin之外的所有对象,但仍然无法工作。非常感谢您的奖金提示,我将从现在开始这样做。使用临时文件一直是解决方案,非常感谢。
"PHP message: PHP Warning:  fopen(/app/image.jpg): failed to open stream: Permission denied in /app/vendor/google/cloud/src/Storage/StorageObject.php on line 585"