为了账号安全,请及时绑定邮箱和手机立即绑定

当使用PHP发送文件时,可恢复下载吗?

当使用PHP发送文件时,可恢复下载吗?

PHP
回首忆惘然 2019-07-11 13:41:41
当使用PHP发送文件时,可恢复下载吗?我们使用PHP脚本进行文件下载,因为我们不想公开可下载文件的绝对路径:header("Content-Type: $ctype");header("Content-Length: " . filesize($file)); header("Content-Disposition: attachment; filename=\"$fileName\""); readfile($file);不幸的是,我们注意到通过这个脚本进行的下载不能被最终用户恢复。有任何方法来支持这种基于PHP的解决方案的可恢复下载吗?
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您需要做的第一件事是发送Accept-Ranges: bytes所有响应中的标头,以告诉客户端您支持部分内容。然后,如果请求具有Range: bytes=x-y接收到报头(与xy)解析客户端请求的范围,像往常一样打开文件,查找x前面的字节并发送下一个字节y - x字节。还将响应设置为HTTP/1.0 206 Partial Content.

在没有测试过任何东西的情况下,这可以或多或少地发挥作用:

$filesize = filesize($file);$offset = 0;$length = $filesize;if ( isset($_SERVER['HTTP_RANGE']) ) {
    // if the HTTP_RANGE header is set we're dealing with partial content

    $partialContent = true;

    // find the requested range
    // this might be too simplistic, apparently the client can request
    // multiple ranges, which can become pretty complex, so ignore it for now
    preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);

    $offset = intval($matches[1]);
    $length = intval($matches[2]) - $offset;} else {
    $partialContent = false;}$file = fopen($file, 'r');
    // seek to the requested offset, this is 0 if it's not a partial content requestfseek($file, $offset);
    $data = fread($file, $length);fclose($file);if ( $partialContent ) {
    // output the right headers for partial content

    header('HTTP/1.1 206 Partial Content');

    header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $filesize);}
    // output the regular HTTP headersheader('Content-Type: ' . $ctype);
    header('Content-Length: ' . $filesize);header('Content-Disposition: attachment; filename="' .
     $fileName . '"');header('Accept-Ranges: bytes');// don't forget to send the data tooprint($data);

我可能错过了一些显而易见的东西,而且我肯定忽略了一些潜在的错误来源,但这应该是一个开始。

有一个部分内容的描述我在文档页面上找到了一些关于部分内容的信息弗瑞德.


查看完整回答
反对 回复 2019-07-11
?
白衣非少年

TA贡献1155条经验 获得超0个赞

是。支持旁路。看见RFC 2616第14.35节 .

这基本上意味着你应该阅读Range标头,然后从指定的偏移量开始为文件提供服务。

这意味着您不能使用readfile(),因为这为整个文件服务。相反,使用fopen()先,然后搜寻()到正确的位置,然后使用福斯特鲁()提供文件。


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 452 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信