广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php怎么实现下载功能
  • 567
分享到

php怎么实现下载功能

2023-06-14 07:06:14 567人浏览 薄情痞子
摘要

小编给大家分享一下PHP怎么实现下载功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php实现下载功能的方法:首先将文件下载请求映射到后端程序url;然后编写具

小编给大家分享一下PHP怎么实现下载功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

php实现下载功能的方法:首先将文件下载请求映射到后端程序url;然后编写具体的文件下载逻辑;最后将文件路径转换成gbk编码即可实现下载文件功能。

问题说明

文件下载,通常有一种最为简单的方法,那就是将url直接指向服务器上文件的所在位置。但是这个方法存在很大的安全隐患。

暴露了服务器文件目录结构

无法禁止非法请求来源,无法对文件下载请求做安全验证

解决方案

一、将文件下载请求映射到后端程序url

借助Http服务器(apache/Nginx)实现映射功能

这里以apache为例进行说明
借助apache的rewrite模块,配置rewrite规则。(关于如何开启rewrite模块,网上很多资源,这里不再赘诉)
项目根目录下创建.htaccess文件,写入rewrite规则

RewriteEngine on#将所有以rar/zip结尾的url,映射给download.php文件RewriteRule (.*\.(rar|zip))$ download.php?file=$1 [NC]

将所有以rar/zip结尾的url,映射给download.php文件(这里为了方便直接映射到了一个php脚本中,如果是使用框架,那就映射到具体的控制器中的某个方法!例如:index.php?c=home&a=download)

二、编写具体的文件下载逻辑

项目目录

以本地项目为例,用户需要下载的zip文件,放在当前项目的temp目录下
php怎么实现下载功能

示例

直接上代码,代码中有详细注释

<?php//接收需要下载的文件名称if(!isset($_GET['file'])) exit('Filename is empty');if(empty($_GET['file'])) exit('Filename not valid');ob_clean();//清除一下缓冲区//获得文件名称$filename = basename(urldecode($_GET['file']));//文件完整路径(这里将真实的文件存放在temp目录下)$filePath = __DIR__."/temp/".$filename;//将utf8编码转换成gbk编码,否则,文件中文名称的文件无法打开$filePath = iconv('UTF-8','gbk',$filePath);//检查文件是否可读if(!is_file($filePath) || !is_readable($filePath)) exit('Can not access file '.$filename);//以只读方式打开文件,并强制使用二进制模式$fileHandle=fopen($filePath,"rb");if($fileHandle===false){    exit("Can not open file: $filename");}//文件类型是二进制流。设置为utf8编码(支持中文文件名称)header('Content-type:application/octet-stream; charset=utf-8');header("Content-Transfer-Encoding: binary");header("Accept-Ranges: bytes");//文件大小header("Content-Length: ".filesize($filePath));//触发浏览器文件下载功能header('Content-Disposition:attachment;filename="'.urlencode($filename).'"');//循环读取文件内容,并输出while(!feof($fileHandle)) {    //从文件指针 handle 读取最多 length 个字节(每次输出10k)    echo fread($fileHandle, 10240);}//关闭文件流fclose($fileHandle);

这里只是做了一个示例(只包括核心功能),为了方便说明直接以GET方式从url中获取用户想要下载的文件名称

注意以下两行代码(为了能够下载中文名称的文件)

$filePath = iconv('UTF-8','gbk',$filePath);header('Content-type:application/octet-stream; charset=utf-8');

如果用户需要下载的是中文名称的文件。则需要将文件路径转换成gbk编码,否则会出现 文件不存在 之类的错误。header中设置utf8编码,也是同样的道理

下载文件

打开浏览器,访问 http://127.0.0.1/rewrite/尴尬.zip    文件便开始下载了。

以上是“php怎么实现下载功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: php怎么实现下载功能

本文链接: https://www.lsjlt.com/news/268795.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php怎么实现下载功能
    小编给大家分享一下php怎么实现下载功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php实现下载功能的方法:首先将文件下载请求映射到后端程序url;然后编写具...
    99+
    2023-06-14
  • javascript 怎么实现下载功能
    本教程操作环境:Windows10系统、javascript1.8.5版本、Dell G3电脑。javascript 怎么实现下载功能?js实现文件下载功能一、a标签下载<body> <button onClick=&qu...
    99+
    2023-05-14
    下载 javascript
  • Android中怎么实现文件下载功能
    今天就跟大家聊聊有关Android中怎么实现文件下载功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。普通单线程下载文件:直接使用URLConnection.openStream()...
    99+
    2023-05-31
    android
  • vbs 中怎么实现多线程下载功能
    这期内容当中小编将会给大家带来有关vbs 中怎么实现多线程下载功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码如下:'by wankoilz url=InputBox("输入完整下...
    99+
    2023-06-08
  • php实现文件下载功能的方法是什么
    本篇内容主要讲解“php实现文件下载功能的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php实现文件下载功能的方法是什么”吧!一、实现文件下载的基本原理在PHP中,实现文件下载的原理...
    99+
    2023-07-06
  • javascript如何实现下载功能
    本篇内容主要讲解“javascript如何实现下载功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript如何实现下载功能”吧!javascript实现下载功能的方法:1、通过a标...
    99+
    2023-07-05
  • Python实现视频下载功能
    最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容。如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站上,增...
    99+
    2022-06-04
    视频下载 功能 Python
  • django 实现文件下载功能
    在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍django中的文件下载。前端实现方式a标签+响应头信息<a ...
    99+
    2023-01-31
    功能 文件 django
  • iOS实现文件下载功能
    本文实例为大家分享了iOS实现文件下载的具体代码,供大家参考,具体内容如下 说明: 1).获取网络文件大小; 2).开启循环,计算每段position开始与结束位置,通过Range头...
    99+
    2022-11-13
  • Servlet实现文件下载功能
    本文实例为大家分享了Servlet实现文件下载的具体代码,供大家参考,具体内容如下把文件目录直接暴露给用户是很不安全的。所以要用Servlet来做,而且这样做,文件的存储方式就更丰富了,可以是从文件系统上取来的,也可以是数据库中经过计算生成...
    99+
    2023-05-30
    servlet 文件下载 实现文件
  • SpringBoot怎么实现文件上传与下载功能
    这篇“SpringBoot怎么实现文件上传与下载功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot怎么实...
    99+
    2023-07-06
  • Java怎么实现FTP的上传与下载功能
    这篇文章主要讲解了“Java怎么实现FTP的上传与下载功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现FTP的上传与下载功能”吧!JAVA操作FTP服务器,只需要创建一个F...
    99+
    2023-06-29
  • Android中怎么利用ListView实现下拉加载功能
    Android中怎么利用ListView实现下拉加载功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。MyListView.Javapublic class&nb...
    99+
    2023-05-30
    listview android
  • vue2怎么实现带有阻尼下拉加载功能
    这篇“vue2怎么实现带有阻尼下拉加载功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue2怎么实现带有阻尼下拉加载功能...
    99+
    2023-07-05
  • C#怎么使用FluentFTP实现FTP上传下载功能
    这篇文章主要介绍“C#怎么使用FluentFTP实现FTP上传下载功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#怎么使用FluentFTP实现FTP上传下载功能”文章能帮助大家解决问题。FT...
    99+
    2023-07-05
  • 利用Servlet怎么实现一个文件下载功能
    本篇文章给大家分享的是有关利用Servlet怎么实现一个文件下载功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Web容器为Servlet生成并且传递的HttpServlet...
    99+
    2023-05-31
    servlet 一个文件
  • 怎么CSS实现加载功能
    这篇文章主要介绍“怎么CSS实现加载功能”,在日常操作中,相信很多人在怎么CSS实现加载功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么CSS实现加载功能”的疑惑有所帮...
    99+
    2022-10-19
  • vue.js怎么实现拉加载以及下拉刷新功能
    本篇内容主要讲解“vue.js怎么实现拉加载以及下拉刷新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue.js怎么实现拉加载以及下拉刷新功能”吧!上拉加...
    99+
    2022-10-19
  • Node中怎么利用WebSocket实现多文件下载功能
    这篇文章将为大家详细讲解有关Node中怎么利用WebSocket实现多文件下载功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。列表下载列表本文地址仓库:h...
    99+
    2022-10-19
  • uniapp怎么实现下拉刷新和上拉加载功能
    随着移动端开发的不断升级,开发者们对于移动应用的需求也越来越高。而在很多移动应用中,下拉刷新和上拉加载更多是必不可少的功能之一,为了提高用户体验,许多移动应用都会加入这两个功能。在这里,我们将介绍如何在uniapp中实现下拉刷新和上拉加载更...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作