为什么文件在PHP强制下载脚本过程中被破坏?

时间:2017-09-25 05:17:30

标签: php

我网站中网页的整体结构: -

<!DOCTYPE html>
<html>
<head>
<title>Home</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
</head>
<body>
<form method="get" action="remote2.php">
<input type="text" name="url" placeholder="Enter URL with http://" />
<input type="text" name="name" placeholder="File Name.jpg" />
<input type="text" name="path" placeholder="File Path" />
<input name="submit" type="submit" value="Upload" />
</form>
<?php
set_time_limit (24 * 60 * 60);
if (!isset($_GET['submit'])) die();
$destination_folder = 'uploads/';
$url = $_GET['file'];
$name = $_GET['name'];
$newfname = $destination_folder . basename($name);
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
  }
  }
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
header('Pragma: public'); 
header('Content-Disposition: attachment; filename="'.basename($name).'"');
header('Content-Transfer-Encoding: binary');
echo readfile(str_replace(" ","%20",$newfname)); 
exit;
?>
</body>
</html>

我想您可以理解代码的用途!我将尝试简要解释一下。

网址格式如下: -

/remote2.php?file=https://i.stack.imgur.com/w0jUI.jpg&name=Rose.jpg&submit=Upload

这是一个强制下载脚本!当有人点击上面给出的链接时,脚本会运行两个活动。

当用户第一次点击链接时(如第一个活动[1]所示),它会将https://i.stack.imgur.com/w0jUI.jpg中的文件存储在uploads/路径中! [2]它还强制文件在浏览器中下载。

当用户第二次点击时,它无法再次从https://i.stack.imgur.com/w0jUI.jpg获取文件,它会直接强制将文件从uploads/Rose.jpg路径下载到浏览器。

我希望我能够清楚地解释清楚。

我的问题是在此过程中,文件已损坏。文件大小没有变化,只是文件被破坏了。当我尝试打开下载的图像时,我收到一条消息“无效图像”。还试图使用其他文件格式,如mp3,但它仍然存在同样的问题。

这段代码有什么问题?我该如何解决?

1 个答案:

答案 0 :(得分:0)

您的文件已损坏,因为您在同一页面中输出了HTML 文件内容。此外,使用headers already sent时,您应该收到header('...')的警告。

将PHP逻辑移至单独文件中的输出文件,并确保打印出文件内容。