safari自动下载带有html后缀的文件
如何下载文件?
方法1:直接通过nginx下载静态文件
如果文件保存在服务器上,您可以使用nginx直接下载文件
例如,用户可以下载pdf文件,因此我的nginx配置可能如下所示:
位置~/文档/(。*)\.pdf $ { root/home/nemo/my file;try _ files/$ uri 404;}根据上述配置,当我请求http://fbd.intelleeegooo.cc/document/test.pdf,时,位于我服务器上的/home/nemo/my file/document/test . pdf文件被下载。当找不到相应的文件时,它将返回到404。
方法2:通过php读取文件并下载
但是,通过上述方式,每个人都可以下载pdf文件。如果下载文件的动作与账号有关,比如用户只能下载某些文件,那么就需要在php中处理用户账号,下载相关文件。
看看我在index.php的示例代码。这段代码的功能是下载test.txt文件
?PHP $ filePath='/home/nemo/fun/testdownloadfile/test . txt ';$ fileName=' test.txtread file($ file path);例如,我打开了一个8764端口,nginx的配置如下:
服务器{ listen 8764server _ name xx . xx . xx;…… …… ……位置/{ root/home/nemo/fun/testdownloadfile;fastcgi _ pass 127 . 0 . 0 . 1: XXX;index.php指数;包括fastcgi.conf}}配置文件中的fastcgi_pass后面可以跟一个ip端口或unix_socket路径。根据你安装的php中的php-fpm.conf的监听。
我们使用命令选项I快捷键打开浏览器的调试模式。当我在浏览器中请求http://xx.xx.xx:8764/时,浏览器直接在页面上显示txt文件的内容。
在调试模式下查看这个请求,它的响应头如下:
您可以看到其中的内容类型是文本/html,这意味着是一个html文件,因此浏览器直接显示在页面上。[对于一些常用的内容类型,请参见本文的结尾]
然后我更改代码并在内部设置标题。示例代码如下:
?PHP $ filePath='/home/nemo/fun/testdownloadfile/test . txt ';$ fileName=' test.txt标题('内容-处置:附件;文件名='。$ FIlename);read file($ file path);当我在chrome中创建新的标签页并输入URL http://fbd.intelleeegooo.cc/document/test.pdf,时,我成功下载了这个文件,如下图所示:
但是当我在safari中时,下载的文件有一个html后缀,如下图所示
我将再次更改代码,设置内容类型,并查看以下示例代码:
?PHP $ filePath='/home/nemo/fun/testdownloadfile/test . txt ';$ fileName=' test.txt标头(' Content-Type:应用程序/八位字节-流;charset=utf-8 ');标题('内容-处置:附件;文件名='。$ FIlename);read file($ file path);修改后,safari中下载的文件是正常的,没有html后缀。
2.2 PHP中读取和输出文件的几种方法
设置完标题信息后,可以使用以下方法输出文件
File_get_contents(),这个方法是将文件的所有内容以字符串的形式读入内存。当文件很大时,它将超过内存限制
$ content=file _ get _ contents($ file path);echo $内容;File(),它以行的形式将所有文件读入数组。文件大的时候会超过$f=file($filePath)的内存限制;而(list ($ line,$content)=每个($ f)) {//$ line是指示哪一行的int类型(从0开始),$content是指示这一行的echo $内容的字符串类型;}readfile(),它读取文件并将其写入输出缓冲区。这种方法可以输出大文件,读取单个文件不会超过内存限制。ob _ end _ clean();read file($ file path);但是看看官方手册中的这段话
Readfile本身不会导致任何内存问题。如果内存不足,请使用ob_get_level()来确保输出缓存已关闭。
但是,readfile()方法仍然会导致内存耗尽
事实上,readfile仍然需要MMAP(如果支持的话)或固定的缓冲区来循环读取文件并直接输出。
Fopen(),类似于用C语言读文件。Fopen可以指定一次读取一定的块大小,并且可以读取大文件。不会超过内存限制
$file=@fopen($filePath,' Rb ');while(!feof($ file)){ print(@ fread($ file,1024 * 8));ob _ flush();flush();}2.3内存限制
在php配置文件php.ini中,有一个memory_limit的设置项,设置每个脚本可以分配的内存。
如下图所示,我稍微放松了一下,改成了256M,默认是128M
如上所述,读取大文件时,内存可能会耗尽。
php中有一个ini_set()方法,可以在脚本运行时保留新值,在脚本结束时恢复。
并非php.ini中的所有设置都可以修改。可以通过ini_set()修改的所有选项都可以从官方手册的这个列表中了解到
有一种方法可以动态修改脚本执行时可以使用的内存大小,而不是必须修改php.ini文件,毕竟该文件是全局的。
在脚本中动态更改某些设置仅对脚本有效,但实际上并不会真正修改php.ini文件。
2.5时限
通常,当使用php下载文件时,会添加一行set_time_limit(0)。这意味着这个php脚本的执行时间没有限制
?PHP $ filePath='/home/nemo/fun/testdownloadfile/test . txt ';$ fileName=' test.txtset _ time _ limit(0);标头(' Content-Type:应用程序/八位字节-流;charset=utf-8 ');标题('内容-处置:附件;文件名='。$ FIlename);read file($ file path);请看官方手册中的解释
内容配置说明
在传统的HTTP响应中,内容处理头指示回复的内容应该以什么形式显示,是内嵌的(即网页或页面的一部分)还是作为附件下载并保存在本地
内容处置头最初是在MIME标准中定义的,HTTP表单和POST请求只使用其所有参数的子集。只有表单数据和可选的名称和文件名参数可以在HTTP场景中应用
在一条直线上的
内联显示txt文件查看下面的示例代码,设置内联,并在浏览器中显示上面的test.txt文件。
?PHP $ filePath='/home/nemo/fun/testdownloadfile/test . txt ';$ fileName=' test.txt标题('内容-处置:内联;文件名='。$ FIlename);read file($ file path);几种常用的内容类型
下面列出了几种常用的内容类型
Text/html,内容为html格式的text/plain,内容为纯文本格式的image/gif,gif图像格式的image/jpeg,jpeg图像格式的image/png,png图像格式的multipart/form-data,常见的POST数据提交方式。这种类型的应用程序/json在需要上传文件时使用,消息体是序列化的json字符串应用程序/八位字节流、二进制流数据。一般在下载文件时,浏览器的原生形式application/x-www-form-URL encoded以key1=val1key2=val2的方式对提交的数据进行编码,key和val都是通过URL转码进行汇总的。
以上就是safari下载文件自动添加边肖引入的html后缀的问题。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!
版权声明:safari自动下载带有html后缀的文件是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。