1,文件类型

(1)文本文件,如xx.txt。

(2)二进制文件,如图片、视频、音频。

2,文件下载流程如下图所示,首先浏览器向服务器发送下载请求,服务器将下载资源读入内存,再通过http将资源返回到指定的目录。

3,下载具体代码如下:

function down_file($file_name, $file_sub_dir){
// $file_name="se.jpg";
//php文件系统默认是gb2312,我们现在通用的utf-8,因此需要把文件名转化为gb2312
$file_name = iconv("utf-8","GB2312",$file_name); $file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;
// $file_path = $_SERVER['DOCMENT_ROOT']."/images/".$file_name; //1。打开文件
if(!file_exists($file_path)){
echo "文件不存在!";
return;
}
$fp = fopen($file_path,"r"); $file_size = filesize($file_path); if($file_size > 1024*10*1024){ //限制下载大文件,10M
// echo "文件过大,不能下载";
echo "<script language='javascript'>window.alert('文件太大,不提供下载服务!');</script>";
return;
} //返回的文件
header("Content-type:application/octet-stream");
//按照字节大小返回
header("Accept-Ranges:bytes");
//返回文件大小
header("Accept-Length:$file_size");
//这里客户端的弹出对话框,对应的文件名
header("Content-Disposition:attachment;filename=".$file_name); //向客户端回送数据,分次传送
$buffer = 1024;
$file_count = 0;
while(!feof($fp) && ($file_size-$file_count > 0)){
$file_data = fread($fp,$buffer);
$file_count += $buffer;
echo $file_data;
}
fclose($fp);
} down_file("se.jpg", "/blog/webroot/images/");

  注意:(1)php的文件系统比较旧,用的字符编码是gb2312,现在大部份文件是utf-8编码,因此需要对文件名进行转码,将utf-8转化为gb2312:

$file_name = iconv("utf-8","GB2312",$file_name);

(2)文件路径用绝对路径,也可以使用相对路径,绝对路径效率更高,

$file_path = $_SERVER['DOCUMENT_ROOT'].$file_sub_dir.$file_name;

php相对路径表示,比如代码页a.php,同目录下有个文件夹image,文件夹中有b.jpg,那么a.php;利用相对路径引用b.jpg时候

$file_path = "./image/b.jpg";

如果image和a.php的父目录同级别,

$file_path = "./../image/b.jpg";

4,网页禁止某个ip访问,

if($_SERVER['REMOTE_ADDR'] == "192.168.1.100"){
echo "禁止你访问!";
}

5,防盗链技术,网站中某些网页希望登陆之后查看,

<?php
/**
* Created by PhpStorm.
* User: usa007lhy
* Date: 2015/10/18
* Time: 19:54
*/
if(isset($_SERVER['HTTP_REFERER'])){
if(strpos($_SERVER['HTTP_REFERER'],"http://localhost/http") == 0){
echo "韩顺平的账号信息...";
}else{
header("Location:warning.php");
}
}else{
header("Location:warning.php");
}
?>

十,PHP下载文件的更多相关文章

  1. 《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  2. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  3. javaweb学习总结二十六(response对象的用法二 下载文件)

    一:浏览器打开服务器上的文件 1:读取服务器上面的资源,如果在web层,可以直接使用servletContext,如果在非web层 可以使用类加载器读取文件 2:向浏览器写数据,实际上是把数据封装到r ...

  4. 分布式进阶(十) linux命令行下载文件以及常用工具:wget、Prozilla、MyGet、Linuxdown、Curl、Axel

    linux命令行下载文件以及常用工具:wget.Prozilla.MyGet.Linuxdown.Curl.Axel 本文介绍常用的几种命令行式的下载工具:wget.Prozilla.MyGet.Li ...

  5. Javaweb学习笔记——(二十二)——————文件上传、下载、Javamail

    文件上传概述      1.文件上传的作用          例如网络硬盘,就是用来上传下载文件的.          在网络浏览器中,时常需要上传照片 2.文件上传对页面的要求          上 ...

  6. selenium测试(Java)--下载文件(十六)

    下载文件需要在Firefox 的profile属性中配置一些参数,如下面的代码: package com.test.download; import java.io.File; import org. ...

  7. katalon系列十二:自动化上传文件、下载文件

    一.下载文件1.下载文件时,需要先设置好Chrome/Firefox下载路径.不弹出下载框等,大家先学习下在selenium下如何设置:https://www.cnblogs.com/fnng/p/7 ...

  8. qt http 下载文件

    本文章介绍如何利用HTTP从网站上下载文件.在Qt网络编程中,需要用到协议,即HTTP.它是超文本传输协议,它是一种文件传输协议.对于HTTP就不多解释了. 在Qt网络编程中,需要用到协议,即HTTP ...

  9. Django学习之十: staticfile 静态文件

    目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方面 总结 Django学习之十: staticfile 静态文件 理解阐述     ...

  10. flask上传下载文件(一)下载

    简介: 作为一个可以和用户交互的web应用,必然要有数据导出功能,导出到excel是比较常用的方式. flask有一个扩展叫flask-excel,可能不适合中国人用,因为没有看到修改列名的功能.也许 ...

随机推荐

  1. apt 查询软件

    apt-cache search percona-server apt list percona-server-server-5.6

  2. 求Half向量

    [求Half向量] 给定入射向量与视角向量.把入射向量与视角向量相加即可,如下: 前提是 lightDir.ViewDir 都是单位向量.

  3. Python基础:面向对象基础 (一) 类及其属性和魔法方法

    定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表 # 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Her ...

  4. 对称二叉树 · symmetric binary tree

    [抄题]: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...

  5. 882. Reachable Nodes In Subdivided Graph

    题目链接 https://leetcode.com/contest/weekly-contest-96/problems/reachable-nodes-in-subdivided-graph/ 解题 ...

  6. UEFI下win10+Ubuntu双启动后完全纯净卸载Ubuntu,重建BCD

    以下内容操作具有风险,操作前请提前备份数据.建议由有丰富经验的人使用,需要掌握diskpart. 背景 使用ubuntu+win10 dual boot后,需要重置回纯净win10系统. BCD是Bo ...

  7. myeclipse便捷导包方式

    1.将spring框架的core导成如图的方式 2.选中项目右键--bulid path--进入buildpath 3.选择add library 4.选择user library 5.选择user ...

  8. Awk使用方法简介

    ==================AWK=================== AWK简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得 ...

  9. cenos7切换阿里源

    备份并安装base reop源 cd /etc/yum.repos.d sudo mv CentOS-Base.repo CentOS-Base.repo.bak 下载阿里源并配置 sudo wget ...

  10. windows游戏开发中一个关于Visual Studio的编译链接成功,输出窗口却显示线程已退出。无法运行项目的问题

    可能是显卡驱动程序版本太高了,退回到以前的版本就ok了. 第一次遇见这个问题可把我给整疯了!! 后来又遇到一次,参考之前的解决方法,很快就搞定了!! 可见,经验可是很重要的一个东西啊.