使用带有0字节(空)的`file_put_contents`上传图像?

时间:2012-03-21 13:35:11

标签: php upload file-get-contents

我使用file_get_contents从网址下载了一张图片,然后使用file_put_contents将其上传到我的网站,图片显示在指定目录中,但大小为零。我已将此目录和父目录中的权限更改为777,但没有任何反应。

我已经在localhost中尝试了相同的代码,它运行得很好。

顺便说一下,我正在使用一个joomla网站和一个名为RSform Pro的组件,它用于创建表单,并提供一个区域,您可以在将数据保存到数据库之前编辑POST数据。这是代码。

$content = file_get_contents($_POST['image_url']);

$date = date ('d-m-Y_h-m-i');   $random = rand(0,1000);
$name = 'mysite_'.$date.$random.'.png';

$filename = '/home/mysite/images/'.$name;

file_put_contents($filename, $content);

1 个答案:

答案 0 :(得分:2)

我从哪里开始,这段代码有太多错误......

  1. 您必须检查file_get_contents的返回值,并确保您的主机允许重新获取远程数据(在php.ini中将allow_url_fopen设置为On)
  2. 之后,其他一切都非常错误,并在您的应用程序中打了一个安全漏洞。您存储在$ content变量中的结果必须写入一个唯一的临时文件,其唯一正确的生成方式是使用tempnam()功能
  3. 在对tempnam()生成的文件名发出file_put_contents并检查操作的返回值之后,你必须使用php的fileinfo函数验证文件是否真的是一个png图像。
  4. 如果上一步成功,则使用rename()将文件移动到永久存储,使用的名称不太可能重复。对于该用途$filename = hash('sha256', openssl_random_pseudo_bytes(16)) . 'png'.然后存储生成的文件名,以便它可以用于构建应用程序将向用户显示的链接。