二进制数据上的 file_put_contents 无法正常工作

Posted

技术标签:

【中文标题】二进制数据上的 file_put_contents 无法正常工作【英文标题】:file_put_contents on binary data not working properly 【发布时间】:2013-11-04 09:25:17 【问题描述】:

我正在尝试读取一个 zip 文件并使其正常工作。现在我想获取 zip 文件的内容(图像)。但是图像被扭曲了..这是我的代码 sn-p:

while ($zip_entry = zip_read($zip))

    echo "<p>";
    echo "Name: " . zip_entry_name($zip_entry) . "<br />";

    if (zip_entry_open($zip, $zip_entry))
    $contents = zip_entry_read($zip_entry);
      $name=zip_entry_name($zip_entry);
    file_put_contents('uphoto/'.$i.'.jpg',$contents);


【问题讨论】:

您确定:echo "$contents&lt;br /&gt;"; 吗? echo "$contents";没必要。我只是把那个代码检查它是否有效 我会在常规文本编辑器中打开生成的 .jpg 文件,以验证是否有某些东西不属于那里。 我怎么知道东西是否应该在那里?@ÁlvaroG.Vicario 也许您的 zip 文件从未打开,因为无论内容是否存在,您都在写入文件。能否请您发布 $contents 变量中的内容。 【参考方案1】:

您可以尝试创建一个新图像:

$i = 0;
while ($zip_entry = zip_read($zip))

    $content = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));                                  
    $image = imagecreatefromstring($content);
    $filename = 'uphoto/'.$i++.'.jpg';
    imagejpeg($image, $filename);
    imagedestroy($image);
    echo '<img src="data:image/jpeg;base64,' . base64_encode($content) . '"><br />';

我使用 zip_entry_filesize() 来定义内容的大小,这似乎是使其正常工作所必需的。

【讨论】:

【参考方案2】:

当您在图像数据中插入 时,它不会起作用。您不能仅通过回显其内容在网页上显示图像。例如,您应该对其进行 base64 编码并将其放入 img 标签中。然后您可以执行以下操作:

echo '<img src="data:image/jpeg;base64,' . base64_encode($content) . '"><br />';

【讨论】:

请参阅上一行中的file_put_contents()。这就是 OP 所要求的。 你可以忽略这一行 echo "$contents";。我正在尝试使用以下代码将图像保存在名为 uphoto 的文件夹中 file_put_contents('uphoto/'.$i. '.jpg',$contents); 在我写这个答案时没有写出 echo "$contents" 只是为了测试的评论。那你可以忽略这个答案。【参考方案3】:

base64_decode 能解决问题吗?未测试:

$i = 0;
while ($zip_entry = zip_read($zip))

    echo "<p>";
    echo "Name: " . zip_entry_name($zip_entry) . "<br />";

    if (zip_entry_open($zip, $zip_entry))
    $contents = base64_decode(zip_entry_read($zip_entry));
    $name=zip_entry_name($zip_entry);
    $filename = 'uphoto/'.$i++.'.jpg';
    file_put_contents($filename,$contents);
    echo '<img src="' . $filename . '">';

【讨论】:

Base64_decode 不是解决方案。请参阅我的新答案,这可能会有所帮助。

以上是关于二进制数据上的 file_put_contents 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

详解PHP file_put_contents() 函数用法示例

file_put_contents() ——将一个字符串写入文件

PHP关于获取二进制数据流转换为文件的方法

ASP要怎么获取上传的二进制数据,然后保存成图片文件!

PHP file_put_contents函数写入不了txt文件 代码如图

file_put_content() 文件权限错误