Using a php://memory wrapper causes errors

前端 未结 3 1847
情歌与酒
情歌与酒 2021-02-09 19:50

I\'m trying to extend the PHP mailer class from Worx by adding a method which allows me to add attachments using string data rather than path to the file.

I came up with

相关标签:
3条回答
  • 2021-02-09 20:13

    Quickly looking at http://php.net/manual/en/wrappers.php.php and the source code, I don't see support for the "/' . md5(microtime());" bit.

    Sample Code:

    <?php
    print "Trying with md5\n";
    $path = 'php://memory/' . md5(microtime());
    $file = fopen($path, 'w');
    if ($file)
    {
        fwrite($file, "blah");
        fclose($file);
    }
    print "done - with md5\n";
    
    print "Trying without md5\n";
    $path = 'php://memory';
    $file = fopen($path, 'w');
    if ($file)
    {
        fwrite($file, "blah");
        fclose($file);
    }
    print "done - no md5\n";
    

    Output:

    buzzbee ~$ php test.php 
    Trying with md5
    
    Warning: fopen(): Invalid php:// URL specified in test.php on line 4
    
    Warning: fopen(php://memory/d2a0eef34dff2b8cc40bca14a761a8eb): failed to open stream: operation failed in test.php on line 4
    done - with md5
    Trying without md5
    done - no md5
    
    0 讨论(0)
  • 2021-02-09 20:20

    The problem here simply is the type and the syntax:

    php://memory and php://temp are read-write streams that allow temporary data to be stored in a file-like wrapper. The only difference between the two is that php://memory will always store its data in memory, whereas php://temp will use a temporary file once the amount of data stored hits a predefined limit (the default is 2 MB). The location of this temporary file is determined in the same way as the sys_get_temp_dir() function.

    In short, the type you want is temp instead and the syntax you want is:

    php://temp/maxmemory:$limit
    

    The $limit is in bytes. You want to count that using safe byte functions.

    0 讨论(0)
  • 2021-02-09 20:30

    It's just php://memory. For example,

    <?php
        $path = 'php://memory';
        $h = fopen($path, "rw+");
        fwrite($h, "bugabuga");
        fseek($h, 0);
        echo stream_get_contents($h);
    

    yields "bugabuga".

    0 讨论(0)
提交回复
热议问题