PHP服务器文件管理器开发小结(九):jQuery动态表单实现文件下载

前文讨论的文件操作,无论是新建、编辑、移动、删除,都是服务端对本地文件系统的操作。这一节需要讨论一个涉及服务端和客户端协调进行的操作:文件下载。

简单的文件下载可以通过将相对路径写入超链接的方式进行,然而这样仅限于服务端Apache有下载权限的文档,如果需要支持对更多文件进行下载,仅仅使用这一方式就远远不够了。这里需要利用PHP的能力,在服务端“取出”文件并“推送”给客户端。

首先是生成下载图标链接:

if (is_readable($filePath)) $info.= "<li><a href=\"#\" title=\"download\" onClick=\"onDownload(‘$filePath‘)\"><img src=\"images/download32.png\" alt=\"\" class=\"tabmenu\"/></a></li>";

这里之所以使用onDownload而不是前文的onElemAct,是为了强调此处不需要jQueryUI的前端提示。当远程文件被推送到本地后,会直接在浏览器中形成下载提示。

由于要利用浏览器默认的文件下载行为,因此需要使用表单而不是jQuery的Ajax系统,因为不用处理返回数据。然而,这个表单应该是对客户隐形的,因此考虑用jQuery动态生成表单:

function onDownload(strFilePath)
{
	var formDownload=$("<form>");
	formDownload.attr("id", "frmDownload");
	formDownload.attr("style","display:none");
	formDownload.attr("target","_self");
	formDownload.attr("method","post");
	formDownload.attr("action","query.php");
	var inputDownloadAct=$("<input>");
	inputDownloadAct.attr("type","hidden");
	inputDownloadAct.attr("name","act");
	inputDownloadAct.attr("value", "download");
	var inputDownloadFile=$("<input>");
	inputDownloadFile.attr("type","hidden");
	inputDownloadFile.attr("name","file");
	inputDownloadFile.attr("value", strFilePath);
	$("body").append(formDownload);
	formDownload.append(inputDownloadAct);
	formDownload.append(inputDownloadFile);
	formDownload.submit(); 
	formDownload.remove();
}

这里将表单的target指向_self,这样就不会弹出额外的窗口。利用append将表单填充到页面body的尾部,用submit提交表单后,再用remove删除表单。注意这里使用的post请求,对应的act是download,name是文件路径。

PHP接收该请求后,需要生成文件下载报文,将文件的内容填充到报文中。

            case "download":
                $isDirContentView = false;
                if (isset($_POST["file"]))
                {
                    $filePath = urldecode($_POST["file"]);
                    header("Content-Type: application/octet-stream");
                    header("content-disposition: attachment;filename=".basename($filePath));
                    header("content-length:".filesize($filePath));
                    readfile($filePath);
                }
                break;

这里,使用header函数添加额外的报头,使得报文符合合适的下载报文格式。其中重要的是为Content-Type指定合适的值,才能使浏览器正确分析该报文。具体值的选择可以参考对照表

将文件长度写到content-length中,然后使用readfile将文件内容读取到响应报文中。同时,将$isDirConentView置为false以避免多余的文件输出。

下面是具体效果:

值得注意的是,如果使用迅雷之类下载工具捕获这一下载请求的话,其会将POST请求该为GET请求,并使得请求内容不可控。因此本节提供的方法仅适用于使用浏览器直接下载的情况。

时间: 2024-10-06 15:48:16

PHP服务器文件管理器开发小结(九):jQuery动态表单实现文件下载的相关文章

PHP服务器文件管理器开发小结(总结):总结、索引和源代码

PHP服务器文件管理器的开发经过前一阶段的介绍基本完成了功能搭建,包括目录的检索.增加.删除.重命名,文件的增加.浏览.修改.重命名.移动,以及文件的上传和下载等功能.本文对前一阶段工作的相关博文进行索引,并提供源代码供有兴趣的同学一同讨论. PHP服务器文件管理器开发小结(一):功能规划 本节讨论了文件管理器的目标功能和运行环境. PHP服务器文件管理器开发小结(二):版面设计和css 本节讨论了页面布局所需的css内容,并介绍了引入jQuery和jQueryUI的方法. PHP服务器文件管理

PHP服务器文件管理器开发小结(一):功能规划

为了更好的学习PHP.AJAX和LAMP等,为搭建PHP服务器打下基础,作者尝试开发一款基于PHP的服务器文件管理器,并且在管理过程中使用AJAX而不刷新页面. 文件管理器包含以下基本操作 当前文件夹 回到首文件夹 回到上一级文件夹 刷新文件夹视图 上传文件 新建文件 新建子文件夹 文件操作 查看内容 编辑内容 下载 重命名 移动 删除 文件夹操作 重命名 删除 基本上实现了以上功能后,一个比较完善的服务器文件管理器就形成了. 注意,本示例仅考虑Apache可操作的权限,不考虑提权的情况. 管理

PHP服务器文件管理器开发小结(十):使用jQuery和iframe实现AJAX文件上传

上一节讨论了文件下载,这一节继续讨论文件上传. 众所周知,前端上传文件比较简单的办法就是使用文件控件<input type="file"/>.然而,如果我们需要上传过程是AJAX的,亦即上传过程不刷新页面,仅反馈需要的信息,那就需要更加精巧的设计了. 首先是上传文件图片链接: <li><a href="#" title="upload" onClick="onUploadFile()">&l

PHP服务器文件管理器开发小结(三):使用jQuery提交AJAX请求

本节将讨论使用jQuery提交AJAX请求的基本方法,并完成显示首文件夹的基本方法. 同时,本节也将讨论使用图片链接提交请求的基本方法. jQuery是一套强大的JS库,将复杂的JS操作封装成简洁的语句,并提供对AJAX的支持.通过 jQuery AJAX 方法,您能够使用 HTTP Get 和 HTTP Post 从远程服务器上请求文本.HTML.XML 或 JSON - 同时您能够把这些外部数据直接载入网页的被选元素中.编写常规的 AJAX 代码并不容易,因为不同的浏览器对 AJAX 的实现

PHP服务器文件管理器开发小结(二):版面设计和css

首先是引用jQuery和jQueryUI的方法,为了减轻服务器的压力,作者引用了第三方的源: <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css"> <script type="text/javascript" src="http://code.jquery.com/jquery-1.

PHP服务器文件管理器开发小结(七):应用jQueryUI预览服务器图片

上一节讨论了利用jQueryUI实现用户友好的新建.查看和编辑文件的界面.然而,这些界面都是针对纯文本的,如果是图像的话,查看文件仅提供纯文本就很不友好了.因此,需要为前端提供图像浏览的方法. 先提供前端JavaScript的代码,首先是"原材料": <div id="dialogImage" style="display:none"> <img  src="" id="imgView"/

PHP服务器文件管理器开发小结(四):利用SESSION响应文件夹导航

书接上回,在首文件夹(HOME)图标的旁边是回到上级文件夹(UP)和刷新当前文件夹(REFRESH)两个图标,对应的图片链接为:         <li><a href="#" title="up" onClick="onUp()"><img src="images/upfolder48.png" class="topmenu" /></a></li&g

PHP服务器文件管理器开发小结(六):使用jQueryUI实现新建、查看和编辑文件

前面几节所做的操作都是对服务器内容的读取,下面开始探讨若干会牵扯到修改服务器的操作. 首先是在当前文件夹下新建文件,对应着文件夹上方的New File菜单项. <li><a href="#" title="new file" onClick="onNewFile()"><img src="images/newfile48.png" class="topmenu" />&l

PHP服务器文件管理器开发小结(八):更多的操作——重命名、移动、删除

这一节介绍几个简单的文件操作的PHP实现:使用rename进行文件和文件夹的重命名以及移动,及使用unlink删除文件和使用rmdir删除文件夹. rename函数的基本语法是 rename($oldname, $newname) 即将$oldname对应的文件或文件夹重命名为$newname对应的文件和文件夹.如果前后名称对应的是同一路径,则该函数仅尝试重命名,否则将尝试移动文件并重命名. 使文件和文件夹重命名的情况基本类似,因此采用同一的处理模式: if (is_writable($file