首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件"Resource #11“不存在

文件"Resource #11“不存在
EN

Stack Overflow用户
提问于 2019-02-09 05:43:28
回答 1查看 1.8K关注 0票数 0

我正在尝试创建一个类,将数组转换为纯文本和文件。但是,当我试图将其保存为tmpfile并共享它时,纯文本工作正常,但我会收到错误。

我的控制器看起来像:

代码语言:javascript
复制
public method index() {
    $props = ['foo'=>'bar']; //array of props;
    return response()->download(MyClass::create($props);
    // I've also tried using return response()->file(MyClass::create($props);
}

我的看起来像:

代码语言:javascript
复制
class MyClass
{
    // transform array to plain text and save
    public static function create($props)
    {

        // I've tried various read/write permissions here with no change.
        $file = fopen(tempnam(sys_get_temp_dir(), 'prefix'), 'w');
        fwrite($file,  implode(PHP_EOL, $props));

            return $file;
    }

    // I've also tried File::put('filename', implode(PHP_EOL, $props)) with the same results.
}

我得到了一个没有发现异常的文件:

The file "Resource id #11" does not exist.

我尝试过tmpfile、tempname和其他文件,并得到了相同的异常。我尝试过传递MyClass::create($props)'uri‘,我得到了

The file "" does not exist

这是因为我的副手犯了错误,还是我做错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-09 18:27:11

您的代码混淆了文件名和文件句柄的用法。

  • 坦南()返回一个字符串:新创建的临时文件的路径
  • fopen()在给定路径上访问文件,并返回“资源”--在PHP中用于引用系统资源的一种特殊类型;在本例中,该资源更具体地说是一个“文件句柄”。
  • 如果在需要字符串的情况下使用资源,PHP只会给您一个描述该资源的标签,如“resource id #11";据我所知,无法取回打开文件句柄的文件名。

create定义中,$filefopen()的结果,“资源”值也是fopen()的结果,也就是打开的文件句柄。由于您是return $file,所以MyClass::create($props)的结果也是文件句柄。

Laravel 方法需要一个字符串,即文件名来访问;当给定一个资源时,它会悄悄地将其转换为string,从而导致所看到的错误。

要获得文件名,需要对create函数进行两次更改:

  • tempnam(sys_get_temp_dir(), 'prefix')的结果放在变量中,例如$filename,然后调用$file = fopen($filename, 'w');
  • 返回$filename而不是$file

还应该在返回之前添加对fclose($file)的调用,以便在将数据写入文件后干净地关闭该文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54603589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档