php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...

一、 index.php中: ?php echo a href='process.php?filename=halo.mp3'下载/a? process.php中: ?php header(Content-type: application/octet-stream);header('Content-Disposition: attachment; filename='. basename($_GET['filename']).'');header(Cont

一、

index.php中:

echo "下载"

?>

process.php中:

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

header('Content-Disposition: attachment; filename="'. basename($_GET['filename']).'"');

header("Content-Length: ". filesize($_GET['filename']));

readfile($_GET['filename']);

?>

这是最简单的方法,但是有个问题:如果请求的路径中包含中文,那么下载的文件名有可能就是乱码。

二、

针对上面问题的解决方案,index.php中:

echo "下载"

?>

process.php中:

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

//处理中文文件名

$ua = $_SERVER["HTTP_USER_AGENT"];

$encoded_filename = urlencode($_GET['filename']);

$encoded_filename = str_replace("+", "%20", $encoded_filename);

if (preg_match("/MSIE/", $ua)) {

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

} else if (preg_match("/Firefox/", $ua)) {

header("Content-Disposition: attachment; filename*=\"utf8''" . $_GET['filename'] . '"');

} else {

header('Content-Disposition: attachment; filename="' . $_GET['filename'] . '"');

}

header("Content-Length: ". filesize($_GET['filename']));

readfile($_GET['filename']);

?>

输出的时候,如果是Apache+PHP,那么还需要发送到Apache的输出缓冲区,最后才发送给用户。而对于Nginx+fpm,如果它们分开部署的话,那还会带来额外的网络IO。

三、

现在貌似没有问题了,但是readfile还是有问题的,虽然PHP的readfile尝试实现的尽量高效,不占用PHP本身的内存,但是实际上它还是需要采用MMAP(如果支持),或者是一个固定的buffer去循环读取文件,直接输出。

那么能不能绕过PHP这层呢,直接由webserver把文件发送给用户呢?可以的,我们可以使用Apache的module mode_xsendfile,让Apache直接发送这个文件给用户。

代码实现如下:(process.php)

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

//处理中文文件名

$ua = $_SERVER["HTTP_USER_AGENT"];

$encoded_filename = urlencode($_GET['filename']);

$encoded_filename = str_replace("+", "%20", $encoded_filename);

if (preg_match("/MSIE/", $ua)) {

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

} else if (preg_match("/Firefox/", $ua)) {

header("Content-Disposition: attachment; filename*=\"utf8''" . $_GET['filename'] . '"');

} else {

header('Content-Disposition: attachment; filename="' . $_GET['filename'] . '"');

}

//让Xsendfile发送文件

header("X-Sendfile: $_GET['filename']");

最后,如果愿意的话,可以先判断后缀,因为有时候图片当成文件下载也会引起一些不方便的:

$type = strrchr($_GET['filename'], "."); //获取后缀

if($type == "jpg" || "png" || "gif"){

header("Content-Disposition: filename=$_GET['filename']"); //这里我试过,加引号的话,下载时会加到文件名中

header("Content-Type: image/$type");

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能十年回顾:CNN、AlphaGo、GAN……它们曾这样改变世界

来源:机器学习研究组订阅号过去十年间,人工智能技术突飞猛进,最疯狂的科幻小说场景现在已经成为我们生活中不可或缺的一部分。十年前,人们在谈论 AI 的理论化和实验,但这些年来,AI 变得更加切实了&#xff…

Falsy Bouncer-freecodecamp算法题目

Falsy Bouncer(过滤数组假值) 要求 删除数组中的所有假值。(在JavaScript中,假值有false、null、0、""、undefined 和 NaN。)思路 用.filter()剔除数组中的假值利用Boolea设置callback函数遇到真值返回true代…

jsp--cookie

cookie(客户端,不是内置对象):Cookies是服务端生成的,再发送给客户端保存 相当于本地缓存的作用: 客户端->服务端 eg:看一个电影,服务端产生发给客户端,第二次看就快了 作用&a…

php的declare,php 中的declare

测试代码:function profile(){global $tmp;printf("Now tmp is %d.\n",$tmp);}register_tick_function("profile");declare(ticks3) {$tmp 1;$tmp 2;$tmp 3;$tmp 4;$tmp 5;$tmp 6;$tmp 7;$tmp 8;$tmp 9;$tmp 10;$tmp 11;//unregiste…

Python学习笔记——GIF倒放处理

自动读取指定路径下所有gif格式的文件,利用Python图像处理库PIL下的Image、ImageSequence模块,批量实现gif倒放处理并保存。代码如下:# encoding: utf-8 import os import sys from PIL import Image, ImageSequencepath sys.path[0] …

OpenAI发布新人工智能系统:根据文字生成图像

来源:新浪科技据报道,旧金山人工智能研究公司OpenAI已经开发了一种新系统,能根据短文本来生成图像。OpenAI在官方博客中表示,这个新系统名为DALL-E,名称来源于艺术家萨尔瓦多达利(Salvador Dali&#xff09…

jsp内置对象--session

session(服务端) session:会话 1. 浏览网站:开始->关闭 2. 购物:浏览,结算,付款,退出 3. 电子邮件: 浏览,写邮件,退出 以上都是session的…

python深拷贝实现原理,js递归实现深拷贝

经过小编之前关于JavaScript深拷贝实现方式的介绍,大家已经知道深拷贝能够实现真正意义上的数组和对象的拷贝。其实使用内置对象JSON虽然简答,但不能将对对象的方法深拷贝,因此使用递归的方式就是最实用的,本文介绍使用递归的方式…

梅宏院士:操作系统变迁有20年周期律,泛在计算是一片新蓝海

梅宏来源:观察者网作者:梅宏院士中国科学院院士、发展中国家科学院院士、欧洲科学院外籍院士、IEEE FELLOW,中国计算机学会理事长,北京大学信息技术高等研究院智能软件技术与应用研究中心首席科学家。信息技术发展正在进入人机物融…

session与cookie的区别

1. session保存在服务端,cookie保存在客户端 2. 安全性:session保存在服务端较为安全,cookie保存在客户端,所以较不安全 3. 保存的内容:session保存的是Object,cookie中保存的都是字符串 4.session是内置…

python输出字典的前十项,从字典列表中获取前5个值?

我从api密钥获取json。这是我的json:{[{"count":27,"stem":"obama","term":"obama"},{"count":20,"stem":"boehner","term":"boehner"},{"count":4,"ste…

IEEE CS:2021年的12大技术趋势

来源:笑看国际风云LOS ALAMITOS, Calif., 16 December 2020 – IEEE计算机协会(IEEE CS)公布了其2021技术预测报告(2021 Technology Predictions),重点关注大流行对人类生活,供应链,…

神经网络matlab仿真,神经网络与matlab仿真

神经网络与matlab仿真摘要随着技术的发展,人工神经网络在各个方面应用越来越广泛,由于matlab仿真技术对神经网络的建模起着十分重要的作用,因此,本文通过讨论神经网络中基础的一类——线性神经网络的matlab仿真,对神经…

jsp内置对象--application

appliation 全局对象 String getContextPath():虚拟路径 String getRealPath(虚拟路径):绝对路径(虚拟路径 相对的绝对路径)

D1 模拟赛

T1 note 数组开小 菜的真实 60分 题目大意&#xff1a; 一个字符串 分成若干段 使每段内都没有重复的字符 求最少的段数 思路&#xff1a; 可以贪心 1 #include<iostream>2 #include<cstdio>3 #include<cmath>4 #include<cstdlib>5 #include<cstrin…

模仿人脑视觉处理,助力神经网络应对对抗性样本

来源&#xff1a;混沌巡洋舰自从深度学习只能识别支票和信封上的手写字母以来&#xff0c;它已经取得了长足的进步。今天&#xff0c;深度神经网络已经成为许多计算机视觉应用的关键组成部分&#xff0c;从照片和视频编辑器到医疗软件和自动驾驶汽车。神经网络大致模仿了大脑的…

jsp四种范围对象

jsp的九大内置对象中又有四个被称为范围对象 四种范围对象&#xff1a;&#xff08;范围由小到大排列为&#xff09; pageContext jsp页面容器 &#xff08;也被称作page对象&#xff09; request 请求对象 session 会话对象 application 全局对象 以…

电子很可能具有意识

© Olhar Digital来源&#xff1a;利维坦文&#xff1a;Tam Hunt译&#xff1a;猫大郎校对&#xff1a;兔子的凌波微步2020年5月&#xff0c;“宇宙有意识吗&#xff1f;”作为标题出现在《新科学人》&#xff08;New Scientist&#xff09;周刊的一期封面上。德国慕尼黑数…

php改密后joomla无法登陆,php – Joomla 3.3禁用“重置密码”功能

您可以使用所需的重定向为这两个视图创建模板覆盖.您必须将文件放在&#xff1a;/templates/*your_template/html/com_users/remind/default.php/templates/*your_template/html/com_users/reset/default.php并在default.php中添加以下代码&#xff1a;/*** package Joomla.Sit…

JDBC--Java Database Connectivity

1.JDBC:Java DataBase Connectivity 可以为多种关系型数据库DBMS 提供统一的访问方式&#xff0c;用Java来操作数据库 2.JDBC API 主要功能&#xff1a; 三件事&#xff0c;具体是通过以下类/接口实现&#xff1a; DriverManager &#xff1a; 管理jdbc驱动 Connection&#x…