“PHP Warning: fopen (/app/image.jpg): failed to open stream: Permission denied in/app/vendor/google/cloud/src/Storage/StorageObject.php он-лайн 585”

у меня есть проблема разрешений пробуя загружать файл Google Клоуд Сторахе используя PHP в методе API, который он получает названная с App.

Чтобы убеждаться, я создал счет услуги, распределил ему список администратора и использовал файл .json с ключами этого счета услуги, чтобы клиент Storage меня заверил, создав. Потом в вызове я перемещаю его из-за параметров данные о файле (который я поместил публика на всякий случай) и маршрут, но не имей значения маршрут, который он тестирует, солите всегда ту же ошибку.

Код моего App, который касается этого метода, - следующий:

<?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;
?>

Когда я перемещаю его в вызове параметры файл и судьбу, я это делаю таким образом:

https://midominiodegoogle.appspot.com/download_archivos_siniestro_app?Archivo=image.jpg&Ruta=/image.jpg

Однажды сделанная это названа распиской следующая ошибка в log консоли:

"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 функционируют без проблемы, ошибки приходят просто можения не размещать файл, который пробует загрузиться в какой-либо из определенных папок.

Спасибо заранее из-за помощи.

0
задан 22.11.2019, 12:05
1 ответ

В конце концов ответ состоит в том, что было необходимо создавать временный файл, в котором в том, чтобы сохранять то, что посылало ее funciГіn downloadToFile, таким образом, с этим временным файлом возможно вынуждать разряд в php с readfile (). Часть кода, который было нужно изменять, была этой.

        $bucket = $storage->bucket($bucketName);
        $object = $bucket->object($objectName);
        $nombre_fichero_tmp = tempnam("/tmp", "FOO");
        $object->downloadToFile($nombre_fichero_tmp);


        if (file_exists($nombre_fichero_tmp)) {
            header('Content-Description: File Transfer');
            header('Content-Type: ' . mime_content_type($nombre_fichero_tmp));
            header('Content-Disposition: inline; filename="'.basename($objectName).'"');//inline hace que se vea en linea, attachment hace que se descargue.
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($nombre_fichero_tmp));
            readfile($nombre_fichero_tmp);
            exit;
        } 

        unlink($nombre_fichero_tmp); 

Благодаря всем из-за вашей colaboraciГіn.

0
ответ дан 01.12.2019, 10:57