先来看下一般文件的安全下载方法: 代码示例:

php

/**

* 一般文件安全下载

* edit www.#

*/

$durl = 'file/phpcms2008_o2abf32efj883c91a.iso';

$filename = 'phpcms2008_o2abf32efj883c91a.iso';

$file = @fopen($durl, 'r');

header("Content-Type: application/octet-stream");

header("Accept-Ranges:    bytes");

header("Accept-Length:    ".filesize($durl));

header("Content-Disposition:    attachment;    filename=".$filename);

echo   fread($file,filesize($durl));

fclose($file);

?>

以上的代码,在遇到大文件时,超过php.ini配置的内存最大值的文件时,服务器会非常占用CPU资源,文件不能正常下载,只能下载几十Kb的文件。

可以用下面的代码来解决: 代码示例:

/**

* 大文件

安全下载的实现代码

* edit www.#

*/

function download($url, $filename) {

// 获得文件大小, 防止超过2G的文件, 用sprintf来读

$filesize = sprintf ( "%u", filesize ( $url ) );

if (! $filesize) {

return;

}

header ( "Content-type:application/octet-stream\n" ); //application/octet-stream

header ( "Content-type:unknown/unknown;" );

header ( "Content-disposition: attachment; filename=\"" . $filename . "\"" );

header ( 'Content-transfer-encoding: binary' );

if ($range = getenv ( 'HTTP_RANGE' )) { // 当有偏移量的时候,采用206的断点续传头

$range = explode ( '=', $range );

$range = $range [1];

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

header ( "Date: " . gmdate ( "D, d M Y H:i:s" ) . " GMT" );

header ( "Last-Modified: " . gmdate ( "D, d M Y H:i:s", filemtime ( $url ) ) . " GMT" );

header ( "Accept-Ranges: bytes" );

header ( "Content-Length:" . ($filesize - $range) );

header ( "Content-Range: bytes " . $range . ($filesize - 1) . "/" . $filesize );

header ( "Connection: close" . "\n\n" );

} e

lse {

header ( "Content-Length:" . $filesize . "\n\n" );

$range = 0;

}

loadFile ( $url );

}

function loadFile($filename, $retbytes = true) {

$buffer = '';

$cnt = 0;

$handle = fopen ( $filename, 'rb' );

if ($handle === false) {

return false;

}

while ( ! feof ( $handle ) ) {

$buffer = fread ( $handle, 1024 * 1024 );

echo $buffer;

ob_flush ();

flush ();

if ($retbytes) {

$cnt += strlen ( $buffer );

}

}

$status = fclose ( $handle );

if ($retbytes && $status) {

return $cnt; // return num. bytes delivered like readfile() does.

}

return $status;

}

?>

调用示例: 代码示例:

//大文件的安全下载

dow

nload($url, $filename);

php文件安全实现方法,php安全下载大文件的实现代码相关推荐

  1. requests下载大文件_11种方法教你用Python高效下载资源!

    在本教程中,你将学习如何使用不同的Python模块从web下载文件.此外,你将下载常规文件.web页面.Amazon S3和其他资源. 最后,你将学习如何克服可能遇到的各种挑战,例如下载重定向的文件. ...

  2. Response.WriteFile 无法下载大文件解决方法

    以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器 ...

  3. php 7.0 readfile_php readfile下载大文件失败的解决方法

    本文实例讲述了php readfile下载大文件失败的解决方法.分享给大家供大家参考,具体如下: 大文件有200多M,只下载了200K就提示下载完成,且不报错. 原因是PHP内存有限制,需要改为按块下 ...

  4. libcurl使用多线程下载大文件源码示例!

    使用libcurl多线程下载大文件的基本思想: 首选打开文件,将文件等分为指定的片段,使用http range下载,一个线程下载一个片段,当线程下载片段时,它们将数据写到打开文件的指定位置,类似BT文 ...

  5. python下载大文件-使用请求在python中下载大文件

    请求是一个非常好的库.我想用它下载大文件(>1GB).问题是不可能将整个文件保存在内存中,我需要将其分块读取.以下代码有问题 1 2 3 4 5 6 7 8 9 10 11import requ ...

  6. Android 开发工具类 27_多线程下载大文件

    多线程下载大文件时序图 FileDownloader.java 1 package com.wangjialin.internet.service.downloader; 2 3 import jav ...

  7. python断点续传下载_Python 3 爬虫|第12章:并发下载大文件 支持断点续传

    1. stream 流式下载大文件 1.1 stream=True 和 iter_content() 我们将继续使用 Python 3 爬虫|第3章:同步阻塞下载 所搭建的测试环境,在 Nginx 默 ...

  8. 百度文件下载慢怎么办?~教你百度网盘无需VIP离线下载大文件

    百度文件下载慢怎么办?-教你百度网盘无需VIP离线下载大文件 众所周知,百度网盘的文件已经对非会员进行了各种限速.不过由于国内其他网盘基本都残废了,百度网盘作为仅存的少数几个,需求还是很大的,经常会碰 ...

  9. [MAC]Google Drive下载大文件

    在使用Chrome从Google Drive下载8G数据集的过程中,多次出现网络错误问题导致下载失败,特在此记录解决方法. 下载前提:已成功翻墙 一.出错原因: Google Drive下载大文件的时 ...

最新文章

  1. 夏天来了,你的数据中心应该跟着热起来
  2. pandas使用fillna函数将dataframe中的缺失值按照列均值进行填充(fill missing values with the mean of the column)
  3. [MOSS 译]如何:在WEB内容查询部件中使用自定义的字段
  4. Linux环境下安装Python第三方库
  5. 手机客户端测试点(全)
  6. 用C语言用指针怎么算通用定积分,C语言:利用指针编写程序,用梯形法计算给定的定积分实例...
  7. pyqt5从子目录加载qrc文件_实战PyQt5: 045-添加资源文件
  8. Win10 owerShell Get命令大全
  9. 内存超频trfc_内存超频教学
  10. Atom飞行手册翻译: 2.2 在Atom中移动
  11. 安装 Windows 自动化 API 3.0 时,visual Studio 2010 更快地运行
  12. 【毕业设计】JAVA网络通信系统的研究与开发(论文+源代码+开题报告)
  13. Telnet命令在Linux / Unix中的用法
  14. ADO.NET数据访问模式
  15. Jupyter Notebook打开时报错的问题解决办法
  16. linux如何用命令进入u盘,linux 下如何打开u盘
  17. 基于android的交流平台,参阅:基于android的大学生信息交流平台的设计与实现
  18. 【读书笔记】薛兆丰经济学讲义——人人都要掌握的经济学思维
  19. JVM_虚拟机执行子系统
  20. uniapp微信小程序引入第三方字体库

热门文章

  1. 开源 | App 开发神仙工具:帮你抓 Bug
  2. R语言 深圳 面授_「深圳侦探电话」用R语言实现深度学习情感分析
  3. python获取当时文件目录_python获取文件目录
  4. 未捕获typeerror: $形象。cropper不是函数_没有学不会的python--细说函数
  5. 安规电容能用什么代替_电容系列之安规电容
  6. 将一个简单远程调用的方式例子改为异步调用
  7. Thinkpad上安装Ubuntu相关事项
  8. canvas基本用法
  9. C#中线程的使用[Thread in C#]
  10. java collections读书笔记(4) stack