PHP中文名文件下载实现

  

php下载文件的流程:

其实就是给予一个链接:  <a href="指向处理文件的地址"></a> 这样,当前端点击链接的时候,指向处理文件,比如download.php

本例题 在download.php同级目录下有resume.docx文件

<?php
    $file_name = ‘resume.docx‘;
    $file_sub_path =$_SERVER[‘DOCUMENT_ROOT‘].__ROOT__.‘/Public/Download/‘;
    $file_path = $file_sub_path.$file_name;
    if (!file_exists($file_path)){  //判断文件是否存在
        echo "文件不存在";
        exit();
    }
    $fp = fopen($file_path,"r+") or die(‘打开文件错误‘);   //下载文件必须要将文件先打开。写入内存
    $file_size = filesize($file_path);
    Header("Content-type:application/octet-stream");
    //按照字节格式返回
    Header("Accept-Ranges:bytes");
    //返回文件大小
    Header("Accept-Length:".$file_size);
    //弹出客户端对话框,对应的文件名
    Header("Content-Disposition:attachment;filename=".$file_name);
    //防止服务器瞬间压力增大,分段读取
    $buffer = 1024;
    while(!feof($fp)){
        $file_data = fread($fp,$buffer);
        echo $file_data;
    }
    fclose($fp);
}

知识点:

$_SERVER[‘DOCUMENT_ROOT‘] 服务器的根路径,比如我的电脑上是 d:wamp/www

__ROOT__是THINKPHP中的用法,指向项目的根路径,比如我的电脑是/tpblog

$file_sub_path 指向,所需要下载文件的路径 d:wamp/www/tpblog/Public/Download

但是我遇到了一个问题,就是如果文件名改成中文的话,就会出现文件不存在的错误

后来找到解决办法是

在开始申明

header("Content-type: text/html;charset=utf-8");

申明网页的编码格式

然后强制转换编码

$file_name = iconv("utf-8","gbk//IGNORE",$file_name);

把UTF-8的编码强制转换为GBK

完整代码如下:

本例题 在download.php同级目录下有测试简历.docx文件

header("Content-type: text/html;charset=utf-8");
$file_name = ‘测试简历.docx‘;
$file_name = iconv("utf-8","gbk//IGNORE",$file_name);
$file_sub_path =$_SERVER[‘DOCUMENT_ROOT‘].__ROOT__.‘/Public/Download/‘;
$file_path = $file_sub_path.$file_name;
if (!file_exists($file_path)){  //判断文件是否存在
    echo "文件不存在";
    exit();
}
$fp = fopen($file_path,"r+") or die(‘打开文件错误‘);   //下载文件必须要将文件先打开。写入内存
$file_size = filesize($file_path);
//返回的文件流
Header("Content-type:application/octet-stream");
//按照字节格式返回
Header("Accept-Ranges:bytes");
//返回文件大小
Header("Accept-Length:".$file_size);
//弹出客户端对话框,对应的文件名
Header("Content-Disposition:attachment;filename=".$file_name);
//防止服务器瞬间压力增大,分段读取
$buffer = 1024;
while(!feof($fp)){
    $file_data = fread($fp,$buffer);
    echo $file_data;
}
fclose($fp);

时间: 2024-08-11 09:57:36

PHP中文名文件下载实现的相关文章

Aspose.Cells导出excel

利用Aspose.Cells导出excel 注意的问题 1.DataTable的处理 2.进行编码,便于中文名文件下载 3.别忘了Aspose.Cells.dll(可以自己在网上搜索) public static bool DataTableToExcel2(DataTable datatable, string filepath, out string error) { error = ""; Aspose.Cells.Workbook wb = new Aspose.Cells.W

解决struts2文件下载中文名问题

package com.bgsnewlook.action; import com.opensymphony.xwork2.ActionSupport;import org.apache.struts2.ServletActionContext; import java.io.InputStream; import java.net.URLEncoder; public class Download extends ActionSupport {    private String inputP

文件下载:&quot;Content-disposition&quot;,&quot;attachment; filename=中文名&gt;&gt;&gt;解决方案

摘录自:http://blog.csdn.net/wangzhi_821/article/details/5047777 文件下载时常会出现如下问题: response.setHeader("Content-disposition","attachment; filename="+as+"");如果as直接写中文名字时,就会直接在IE页面打开Excel文件(弹出后点打开会在IE页面打开,注意此时的“你想打开或保存此文件吗?”,名称会显示一个类似C

设置文件下载时客户端显示的附件中文名

/** * 设置下载文件中文件的名称 * * @param filename * @param request * @return */ public static String encodeFilename(String filename, HttpServletRequest request) { /** * 获取客户端浏览器和操作系统信息 * 在IE浏览器中得到的是:User-Agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;

Struts2文件下载中文名乱码

Struts2中提供了快捷的下载方式,通过配置struts.xml文件即可实现文件的下载,但是功能实现后下载文件的文件名却出现乱码,或者直接来个***.action,让人很是无语,但很显然,这是中文乱码问题需要设置编码格式,道理都懂,但是怎样实现呢?其实很简单,上代码: <result name="download" type="stream"> <param name="contentType">application/

java 网络文件下载(并命中文名)

public void download(HttpServletRequest request, HttpServletResponse response){ //获取服务器文件 String file_url = "http//:www.baidu.com/201811239413.doc"; InputStream ins = null; try { ins = new URL(file_url).openStream(); /* 设置文件ContentType类型,这样设置,会自

php提供更快的文件下载

在微博上偶然看到一篇介绍php更快下载文件的方法,其实就是利用web服务器的xsendfile特性,鸟哥的博客中只说了apache的实现方式,我找到了介绍nginx实现方式的文章,整理一下! let's go! 一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件. 但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载. <?php $file = "/tm

flex 文件下载 +Tomcat web应用服务器

注意点: 1.FileReference.download() 方法提示用户提供文件的保存位置并开始从远程 URL 进行下载.直接加载请求路径下载,不需要后台的支持. 2.针对文件中文名的问题,需要双方设置编码: 首先flex端: var download_request:URLRequest=new URLRequest(encodeURI(StringUtil.trim(url))); encodeURI(uri:String="undefined"):String 将字符串编码为

php使用X-SendFile头加速文件下载

在PHP中让文件下载更快的一个方法,那就是使用X-SendFile头实现,主流量的服务器都支持这个头文件. 一般来说, 可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 采用让PHP来做转发, 为用户提供文件下载. <?php $file = "/tmp/dummy.tar.gz"; header("Content-type: applicat