2010-10-23 86 views
2

我收到文件(图像)与阿贾克斯上传到我的PHP脚本,并已完成了使用这方面的工作:使用PHP://输入和file_put_contents

$input = fopen("php://input", "r"); 
file_put_contents('image.jpg', $input); 

很显然,我会净化输入此操作之前, 。

有一两件事我想检查是之前创建新文件的文件大小,具体如下:

$input = fopen("php://input", "r"); 
$temp = tmpfile(); 
$realsize = stream_copy_to_stream($input, $temp); 
if ($realsize === $_SERVER["CONTENT_LENGTH"]) { 
    file_put_contents('image.jpg', $temp); 
} 

这是行不通的。该文件已创建,但其大小为0字节,因此内容未被放入文件中。我不太熟悉使用流,但我不明白为什么这不应该起作用,所以我转向你寻求帮助。提前致谢!

+1

到底是如何在你的web浏览器上传?通常,你想使用'multipart/form-data'形式编码,然后用'$ _FILES'获取上传的文件。通过'php:// input',你表示你期望文件覆盖整个请求体。这表明您正在使用专有方法在网页浏览器中上传文件。一个自定义的applet可能? – BalusC 2010-10-23 19:44:35

+0

我正在读取''元素的'files'集合,并通过XHR'send()'方法发送'file'。没有使用'

',因为我不想使用iframe。目前只支持Firefox和Chrome(不确定Safari)。 – Rafael 2010-10-23 20:02:22

+0

请启用错误报告和显示错误。 – NikiC 2010-10-23 20:04:46

回答

4

的解决方案是看似简单:

$input = fopen("php://input", "r"); 
file_put_contents($path, $input); 
+0

这种方法是否被认为是安全的? – astroanu 2014-05-28 12:43:36

1

您正在使用文件资源,就好像它们是字符串一样。相反,你可以再次使用stream_copy_to_stream

stream_copy_to_stream($temp, fopen('image.jpg', 'w')); 
+0

感谢您的建议,但我只是放弃了这一点,它不起作用。 – Rafael 2010-10-23 20:00:19

+0

错误是:警告:file_get_contents()期望参数1是字符串,给定的资源。 – Rafael 2010-10-23 20:07:28

+0

@Rafael:我编辑了我的答案;) – NikiC 2010-10-23 20:12:01