作者foxzgerald (O⊥M)
看板PHP
标题Re: [请益] 下载档案的问题
时间Wed Nov 29 02:49:22 2006
※ 引述《rollman (死命咬着牙...)》之铭言:
: <html>
: <head>
: </head>
: <body>
: <form name="form1" method="post" action="test.php">
: <select name="column1" size=1 >
: <option value="Select">请选择</option>
: <option value="WDD051001.pdf">WDD1</option>
: <option value="WDD051101.pdf">WDD2</option>
: </select>
: <input name="submit" type="submit" value="Ok">
: </form>
: <?
: $file_name = $_POST["column1"];
: $file_url = rawurlencode($file_name);
: header("Content-Type: application/download");
: header("Content-Disposition: attachment; filename=$file_name");
: readfile($file_url);
: ?>
: </body>
: </html>
若你的 pdf 不是以 binary 存在资料库中,而是在某资料夹,
那应不需要用这麽复杂的方式--直接提供 LINK 就好了。
若因某种原因坚持用这方式,ok
我认为你 header 的处理方式有点怪。基本上在传送 header 之前,
不能有其他输出。因为 header 的意义是在定义『之後』的 http 资
料流是属何种型态。若已先输出了 html ,那麽之後的所有档案都会
被认定属於 html 型态。是故,照你这麽做,理当该得到 warning ?
(有可能因为当掉了所以没能看到 ^^")
我建议的处理方式是,将 pdf 的输出另外写个 php 管理。亦即将引
述的 php code 放进 pdf.php。档案名称可以 GET 传入,
例:pdf.php?filename=WDD051001.pdf
这一来这 pdf.php 输出的内容,才是真的 pdf。你原先的程式码是将
PDF 的 raw data 硬塞进 html 当中,我猜可能是这个原因才使 Browser 当掉
pdf.php 的 header 最好包含下列三个资讯:
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$filename");
你的程式码中漏了 Content-length,此外 Content-type 似乎与 pdf 的型态不符。
Content-length 可以让浏览器比较能预估正确的下载时间、以及结束点;
而 Content-type 的设定上, pdf 应为 application/pdf。 若想知道其他的 type
请参考 MIME 的相关资料。
另外补充一点,上述的方法或许可以解决问题,但是安全上有所疑虑。
特别是 pdf.php?filename=WDD051001.pdf 这段。若要稍微改进一些安全性,
那麽最好将 .pdf 附档名的部分放进程式;或者将档名作特殊的处理,例如:
用 HASH 映射档名。直接用外部变数指定档名,可能藏有资安问题。
--
「640K ought to be enough for anybody.!」
- Bill Gates -
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.199.121
※ 编辑: foxzgerald 来自: 140.119.199.121 (11/29 17:05)