【问题标题】:php - Pass contents of file to function that's expecting a filenamephp - 将文件内容传递给需要文件名的函数
【发布时间】:2018-12-23 07:16:38
【问题描述】:

我有一个文件的内容在一个字符串中。我需要将此文件传递给一个函数,该函数期望参数是文件的名称,而不是内容。显而易见且可能最简单的方法是将内容写入临时文件,然后将该文件名传递给函数,并在完成后取消链接文件。

但是,我正在寻找一种不涉及将文件写入文件系统然后再将其读回的解决方案。我在多种情况下都需要这个,所以我没有在寻找用于解决特定函数,但更多的是通用方法,适用于任何需要文件名的函数(例如file_get_contents())。

这里有一些想法,但不知道如何实现这些:

  • 是否可以将内容写入内存中的某处,然后 将其作为文件名传递给函数?也许使用的东西 php://memory
  • 是否可以将内容写入管道,然后传递名称 管道到函数?

我对@9​​87654325@ 做了一个简短的概念验证,如下所示,但没有运气:

$data = "This is some file data.\n";
file_put_contents( 'php://memory', $data );
echo file_get_contents( 'php://memory' );

想知道解决这个问题的好方法。谷歌搜索没有为我提供任何信息。

【问题讨论】:

  • 你避开了房间里的大象。你用的是什么功能?
  • stackoverflow.com/questions/7719376/…看来,如果你打开 php://memory 两次,那么它无论如何都会是不同的内容。
  • 您也许可以使用mikey179/vfsStream 但这听起来有点XY 问题。我的意思是,如果你知道字符串的内容来自一个文件,为什么不直接使用那个文件呢?
  • @Andreas 我并没有回避这个问题,我通过说我正在寻找一个通用解决方案来解决这个问题,该解决方案将适用于任何需要文件名的函数。在这个特定的例子中,我正在使用 curl_file_create(),但我不确定这是否相关。
  • @AlexHowansky "如果你知道字符串的内容来自文件" - 在这种特殊情况下,文件的内容被接收到 API 中,因此磁盘上没有文件我可以访问,只有内容作为字符串。我想将此数据传递给一个需要文件名的函数,而不必先将其写入磁盘(似乎浪费资源)。

标签: php


【解决方案1】:

这主要取决于目标函数对文件名的作用。运气好的话可以register your own stream wrapper

stream_wrapper_register('demo', 'DemoStream');

$data = "This is some file data.\n";
$filename = 'demo://foo';
file_put_contents($filename, $data );
echo file_get_contents($filename);

【讨论】:

  • 这看起来很有希望。作为参考,这里是关于示例类的文档:php.net/manual/en/stream.streamwrapper.example-1.php
  • 我只是用这个例子做了一个概念验证,并实现了一个基本的stream_stat() 函数(file_get_contents() 需要),效果很好,谢谢!
【解决方案2】:

为什么不使用 /tmp/ 目录中的文件?像这样:

<?php

$filename = '/tmp/mytmpfile';
$data = "This is some file.\n";
file_put_contents($filename, $data);
$result = file_get_contents($filename);
var_dump($result);

【讨论】:

  • 正如问题中提到的,我想避免写出文件系统只是为了再次读取它。
  • @NickCoons 我添加了一个没有临时文件的解决方案。
【解决方案3】:

好吧,正如你所说的你不想使用文件,你不应该使用 file_get_contents()。 但是你可以通过使用 stream_get_contents() 来达到同样的效果,像这样:

<?php
$data = "This is some file data.\n";
$handle = fopen('php://memory', 'r+'); // open an r/w handle to memory
fputs($handle, $data); // write the data
rewind($handle); // rewind the pointer
echo stream_get_contents($handle); // retrieve the contents

【讨论】:

  • 在使用这种方法时,我可以将什么值传递给需要文件名的函数(如file_get_contents())?
猜你喜欢
  • 1970-01-01
  • 2023-01-03
  • 2018-04-04
  • 2014-08-29
  • 1970-01-01
  • 2019-05-25
  • 2012-07-29
  • 2018-12-17
  • 1970-01-01
相关资源
最近更新 更多