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

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

我们使用PHP脚本进行文件下载,因为我们不想公开可下载文件的绝对路径:

header("Content-Type: $ctype");header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=\"$fileName\"");
readfile($file);

不幸的是,我们注意到通过这个脚本进行的下载不能被最终用户恢复。

有任何方法来支持这种基于PHP的解决方案的可恢复下载吗?


回首忆惘然
浏览 453回答 3
3回答

拉丁的传说

您需要做的第一件事是发送Accept-Ranges: bytes所有响应中的标头,以告诉客户端您支持部分内容。然后,如果请求具有Range: bytes=x-y接收到报头(与x和y)解析客户端请求的范围,像往常一样打开文件,查找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);我可能错过了一些显而易见的东西,而且我肯定忽略了一些潜在的错误来源,但这应该是一个开始。有一个部分内容的描述我在文档页面上找到了一些关于部分内容的信息弗瑞德.

白衣非少年

是。支持旁路。看见RFC 2616第14.35节 .这基本上意味着你应该阅读Range标头,然后从指定的偏移量开始为文件提供服务。这意味着您不能使用readfile(),因为这为整个文件服务。相反,使用fopen()先,然后搜寻()到正确的位置,然后使用福斯特鲁()提供文件。
打开App,查看更多内容
随时随地看视频慕课网APP