1、背景介绍
在实际开发中,我们经常需要使用文件上传功能。在传统的方式中,一般采用form表单提交实现。但是此功能有很大的局限性,不能在不刷新页面的情况下提交并更新页面内容,因此我们需要模拟Ajax的方式进行文件上传,以免影响用户体验。
2、实现方式介绍
在此我们介绍一种基于PHP和iframe的方式来实现文件上传功能。它的核心原理是:因为iframe可以与父页面通信,我们可以通过在iframe中提交表单来实现文件上传操作,然后通过iframe向父页面发送信息,告诉它上传是否成功并返回相关的信息。
2.1 方案流程图示
下面是利用iframe来实现文件上传的流程图,从中可以看出整个流程的大致实现,包括页面的初始化,文件上传的过程,以及上传结果的回调。
2.2 代码实现
代码实现包括两个部分:HTML代码和PHP后台代码。
HTML代码部分:
<form id="uploadForm" action="./upload.php" method="post" enctype="multipart/form-data">
<input type="file" id="uploadInput" name="uploadInput" />
<input type="button" id="uploadBtn" value="上传" />
</form>
<iframe id="uploadIframe" name="uploadIframe" style="display:none"></iframe>
<div id="progressBar"></div>
<p id="uploadResult"></p>
其中,表单中的input[type="file"]是文件上传控件,input[type="button"]是上传按钮。iframe标签用于文件上传过程中的数据异步传输,此标签为隐藏标签。div标签用于展示上传进度,p标签用于展示上传结果。
PHP后台代码部分:
$upload_file = $_FILES['uploadInput']['name'];
$upload_file_temp = $_FILES['uploadInput']['tmp_name'];
if(move_uploaded_file($upload_file_temp, "./upload/" . $upload_file)){
echo '{"status":1, "msg":"上传成功"}';
}else{
echo '{"status":0, "msg":"上传失败"}';
}
其中,该段代码的核心内容是将上传文件移动到指定的目录下。上传成功的时候,我们会返回JSON格式的字符串,状态码为1;上传失败的时候,我们会返回JSON格式的字符串,状态码为0。
3、实现效果
我们使用上述代码后,实现了基于iframe方式的文件上传,且上传过程中的数据异步传输,其其中的一个重要特点是不会刷新整个页面。
上传前:
上传中:
上传成功:
上传失败:
从上图中,我们可以看出当我们进行文件上传时,浏览器会将表单数据和文件数据异步上传,而滚动条上的进度条会实时更新,直到上传完成后,我们才会在上传结果区域清晰地看到上传成功的提示信息或者上传失败的提示信息。这样,我们就解决了文件上传时页面刷新的问题,增强了用户体验。