【问题标题】:SplFileObject error failed to open stream: No such file or directorySplFileObject 错误无法打开流:没有这样的文件或目录
【发布时间】:2014-03-02 22:02:20
【问题描述】:

我正在尝试在 symfony2 中实现存折 Web 服务并遵循此 passbook bundle,我的控制器看起来像这样

if ($form->isValid()) {
        // Create an event ticket
        $pass = new EventTicket("1234567890", "The Beat Goes On");
        $pass->setBackgroundColor('rgb(60, 65, 76)');
        $pass->setLogoText('Apple Inc.');

        // Create pass structure
        $structure = new Structure();

        // Add primary field
        $primary = new Field('event', 'The Beat Goes On');
        $primary->setLabel('Event');
        $structure->addPrimaryField($primary);

        // Add secondary field
        $secondary = new Field('location', 'Moscone West');
        $secondary->setLabel('Location');
        $structure->addSecondaryField($secondary);

        // Add auxiliary field
        $auxiliary = new Field('datetime', '2013-04-15 @10:25');
        $auxiliary->setLabel('Date & Time');
        $structure->addAuxiliaryField($auxiliary);

        // Add icon image
        $icon = new Image('appassBundle/Resources/Images/icon.png', 'icon');
        $pass->addImage($icon);

        // Set pass structure
        $pass->setStructure($structure);

        // Add barcode
        $barcode = new Barcode(Barcode::TYPE_QR, 'barcodeMessage');
        $pass->setBarcode($barcode);

        // Create pass factory instance
        $factory = new PassFactory('pass.dk.mcoupons.mcoupon', '9W6X83AQ63', 'KA Innovation ApS', '%kernel.root_dir%/Resources/certificates/certificate.p12', 'hestmink09', '%kernel.root_dir%/Resources/certificates/applewwdrca.pem');
        $factory->setOutputPath('%kernel.root_dir%/logs/pkpass');
        $factory->package($pass);
        //$em = $this->getDoctrine()->getEntityManager();
        //$em->persist($task);
        //$em->flush();
        echo 'pass generated ';
        return $this->render('apbappassBundle:Default:index.html.twig');

    }

但它给了我这个错误

SplFileObject::__construct(apppassBundle/Resources/Images/icon.png):无法打开流:没有这样的文件或目录 500 内部服务器错误 - RuntimeException

我尝试了不同的方法来给出路径但失败了。 这是存储我的图像的层次结构或文件夹结构

【问题讨论】:

  • apbappassBundle.php在appassBundle文件夹下,所以相对路径应该是Resources/Images/icon.php
  • 现在它给了我这个错误 SplFileObject::__construct(Resources/Images/icon.png): failed to open stream: No such file or directory
  • 包含上述代码的文件的路径是什么。
  • 它是否具有访问该文件的必要权限?
  • tomas 我尝试设置权限但无法这样做。你看我对这个平台很陌生。反正问题已经解决了thanx

标签: php symfony path filepath passbook


【解决方案1】:

问题

错误说明了一切。这意味着您的 Image 对象试图在后台实例化 SplFileObject
由于您提供的文件不存在,SplFileObject::__construct() throws an exception 这是您得到的文件。

修复

相对路径很容易成为一场噩梦,CLI SAPI 等。可以搞砸一切。简单的解决方法是使用绝对路径。我看到了两种处理方法。

相对于当前文件的绝对路径

为了获取当前的绝对路径,可以使用__DIR__ 魔法常数。这是一个使用示例

// apb/appassBundle/Controller/BarController::fooAction


$iconPath = sprintf("%s/../Resources/Images/icon.png", __DIR__);
$icon = new Image($iconPath, "icon");

$iconPath 现在包含图标的绝对路径。例如:

/path/to/project/src/apb/appassBundle/Controller/../Resources/Images/icon.png

这是正确的,并且文件确实存在。

相对于包的绝对路径

另一种方法是获取存储在包中的路径。 BundleInterface 有一个 getPath() 方法,它返回包的绝对路径。 (bundle的根目录)

// apb/appassBundle/Controller/BarController::fooAction

$bundle = $this->get('kernel')->getBundle('apbappassBundle');
$iconPath = sprintf("%s/Resources/Images/icon.png", $bundle->getPath());

$icon = new Image($iconPath, "icon");

$iconPath 现在包含类似

/path/to/project/src/apb/appassBundle/Resources/Images/icon.png

这也是正确的


2014 年 7 月 17 日编辑

作为mentionned by gilden,另一种方法是使用方法KernelInterface::locateResource
你可以这样使用它

$iconPath = $this->get('kernel')->locateResource('@apbappassBundle/Resources/Images/icon.png');
$icon = new Image($iconPath, "icon");

【讨论】:

  • 感谢您的回答
【解决方案2】:

试试

 $icon = new Image('%kernel.root_dir%/appassBundle/Resources/Images/icon.png', 'icon');

或许:

$iconPath = $this->get('kernel')->getRootDir().'/appassBundle/Resources/Images/icon.png';
$icon = new Image($iconPath, 'icon');

或者类似的,我没有看到你项目的整个结构。

【讨论】:

  • 这正是我所做的,它解决了我的问题,但感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 2019-07-27
  • 2013-12-15
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多