我有一个pdf文件,如果通过查看器下载,它会以正确的文件大小下载,但是当我使用此代码表示下载选择时,pdf的文件大小会发生变化,并且当您使用adobe / nitro /打开时,它会变得无用等
<?php
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 'Off');
if (isset($_GET['url'])) {
$fullPath = $_GET['url'];
if($fullPath) {
@$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-Disposition: attachment;
filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
header("Content-type: application/pdf"); // add here more headers for diff. extensions
break;
default;
header("Location: ".$fullPath);
exit;
}
if($fsize) {//checking if file size exist
header("Content-length: $fsize");
}
fopen($fsize, "r");
exit;
}
}
?>
我注意到服务器上的文件大小是24kb。我去网址查看然后点击从pdf查看器下载文件下载就好了,并在24kb下验证了我的下载文件夹中的文件大小。然而,当我使用上面的代码作为我的download.php它下载但回来为2kb。
有人可以帮我弄清楚为什么要更改文件大小吗?
答案 0 :(得分:0)
我没有看到您实际发送文件的任何代码。请确保您实际发送文件。您已经使用了fopen()
,但是您没有使用fread()
这就是为什么文件被打开但没有被读取的原因可能就是为什么它显示了一些默认输出,相当于2kb。您可以使用更简单的readfile()
代替
为此替换此行
fopen($fsize, "r");
这一个
readfile('path/to/' . $path_parts["basename"]);
万一你要处理像几个MB这样的大文件,那么fopen会更好地适应你,因为它会提高内存效率。另请注意b
参数中的fopen()
标志它指的是二进制模式所以无论何时发送像pdf,图像等二进制文件,你都应该使用这个标志
set_time_limit(0);
$file = @fopen('path/to/' . $path_parts["basename"],"rb");
while(!feof('path/to/' . $path_parts["basename"]))
{
print(@fread('path/to/' . $path_parts["basename"], 1024*2));
ob_flush();
flush();
}
答案 1 :(得分:0)
问题是它开始的网址中的/。一旦我为它工作的网址添加了一个修剪。现在,我开始研究这个我不认为它真的有用只是出现了它。
$trmfullPath = $_GET['url'];
$fullPath = trim($trmfullPath, "/");
这似乎解决了这个问题。现在也没有在我的PHP错误日志中得到任何错误。