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