我的数据库中有一个blob资源.我想暂时将此文件包装到Symfony File对象中,因为我想使用扩展guesser等特定方法,并应用symfony文件验证器.我想将这个临时文件存储到内存中,因为blob是小文件,我不想在每个请求中在磁盘中创建一个文件.
我试着这样做:
$file = new File ('php://temp');
Run Code Online (Sandbox Code Playgroud)
但是symfony会抛出一个错误,上面写着"文件"php:// temp"不存在".查看文件源,错误是由构造函数中的"is_file($ path)"检查引起的,我可以在第二个参数中使这个put false无效.但是,如果我这样做:
$file = new File ('php://temp', false);
Run Code Online (Sandbox Code Playgroud)
文件已创建,但随后错误会再次出现,例如当我使用guesser时:
$file->guessExtension($file)
Run Code Online (Sandbox Code Playgroud)
因为在Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php中:
public function guess($path)
{
if (!is_file($path)) {
throw new FileNotFoundException($path);
}
(...)
Run Code Online (Sandbox Code Playgroud)
好.然后我的问题是:有一种方法可以在File对象中加载'php:// temp'或'php:// memory'吗?
发生这种情况的原因可能是因为php://temp和php://memory是不可重用的,因此一旦您写入内容,当您下次需要它时,内容可能已经不存在了。来自 PHP 手册:
php://memory 和 php://temp 不可重用,即流关闭后无法再次引用它们。
Run Code Online (Sandbox Code Playgroud)file_put_contents('php://memory', 'PHP'); echo file_get_contents('php://memory'); // prints nothing
php://temp你一开始是怎么写信的?这将是比 SymfonyFile类更重要的问题。我怀疑当您创建一个已经消失的File实例时。php://temp
值得注意的是,使用php://temp将在磁盘上的临时位置创建一个文件,因此您也可以使用 write 到tempnam()句柄。至少这样您将拥有对物理(但临时)文件的引用。