今儿说点儿基础但是蛮重要的前端技术——使用file input实现文件上传。
话说很久以前,我一直以为鼠标在点击file input,弹出dialog,选择文件点”打开“以后,文件就自动上传了的,现在终于知道,自己太傻太天真了。操作系统才不会自动帮你做那个事情捏~ 今天跟踪了下js执行的流程,知道了真正执行上传动作之前在本地客户端到底完成了哪些动作。
当点击dialog中的”打开“后,客户端执行的唯一操作是改变file input的value,并把file input的相关文件参数赋给包裹它的form,比如,input的name是pic1,那么此时,form下就多了一个叫做”pic1“的对象属性,下面是这个属性在form中的样子,this就是那个form对象:
看到我画框的那个地方了吗?对,就是那个‘files’属性,这个才是整个上传的关键,它里面装的就是真正的要上传的文件的相关数据,展开看看,
里面包含文件名,大小,类型以及二进制获取方法等信息,这些在上传过程中都是关键的信息。
接下来,一般会选择两种方式触发form的提交:
1. file input的onchange中自动调用form.submit;
2. 添加一个submit型的input,点击提交。
form要正确实现上传提交要具备几个必须要素:
1. 有一个action,我的后台使用php写的,因此我的action叫做'/upload/do_upload'(我的没有php后缀,是因为我使用了codeigniter这个框架。)。
2. method="POST"
3. enctype="multipart/form-data"
form提交到后台以后是什么样子呢?按照action的设定,后台php文件中存在一个do_upload方法,在该方法中,你可以取到一个系统变量,叫做$_FILES,用firephp跟踪一下看看$_FILES中有什么数据:
由上图可知,$_FILES是一个数组,它的元素就是我们前端传过去的文件数据,在本例子中就是pic1,pic1中包含一些file信息。
接下来就要真的传文件到服务器了。在form提交以后,服务器会以临时文件的形式保存上传文件。我们需要做的,只是把这个临时文件copy到服务器目标文件夹。执行方式如下,
copy($_FILES['pic1']['tmp_name'], WEB_PATH.'/tmp/'.$user_uid.'.'.$file_type);
‘copy’是php的内置函数。第一个参数代表临时文件地址,第二个参数是目标文件路径。
特别要注意的是,你要事先创建这个WEB_PATH.'/tmp/'的路径,否则上传文件会找不到位置。
执行完这一步,去你的服务器文件夹下看一看,就会发现新文件已上传成功了。
文件上传成功后,总要做些回调处理,比如显示下预览图或者文件上传格式不正确时,返回错误信息。你可以直接echo返回,也可以自己写一个json解析函数,返回。
返回后这些信息如何接收是最后一个问题了。一般通用的方法时为
1. form设置target属性,如:target="Upfiler_file_iframe"。
2. 创建一个name为"Upfiler_file_iframe"的iframe,记得隐藏哦,因为他就是用来装数据的:
'<iframe frameborder="0" src="about:blank" name="Upfiler_file_iframe" id="Upfiler_file_iframe" class="fb_img_iframe" style="display:none;"></iframe>'
如此这般,后台上传函数执行完成后,返回的数据就会被塞到这个iframe中,那怎么取出来呢?我假设你用了JQuery库,则做下面的操作:
var jIO = $('#Upfiler_file_iframe');
jIO.load(function(){
var result = eval('(' + $(jIO[0].contentWindow.document.body).text() + ')');
});
jIO.load会在文件上传成功后,自动被调用;而 $(jIO[0].contentWindow.document.body).text()装的就是你从后台返回的信息。
你可能注意到我用了eval(),这是为什么呢?
原因是,我返回的数据是json格式,但是经过text()取值后,返回结果变成了全字符串格式,我需要eval一下,把它变回
对象,这样我才能通过"."的形式把我要的数据拿出来。之后你就可以为所欲为了:去掉加载图标,插入预览图等等。
至此,文件上传的操作就全部结束了。
备忘结束,也希望给来串门的其它同道以帮助。
- 大小: 138.9 KB
- 大小: 28.9 KB
- 大小: 19.2 KB
- 大小: 10.9 KB
分享到:
相关推荐
【PHP文件管理系统源码详解】 PHP文件管理系统是一种基于PHP编程语言构建的应用程序,它允许用户通过Web界面来创建、编辑、删除、搜索和管理服务器上的文件和目录。这样的系统对于网站管理员、开发人员以及需要远程...
《jQuery图片裁切+PHP文件上传技术详解》 在网页应用中,图片处理是一项常见的功能,用户可能需要上传图片并对其进行裁剪以适应特定尺寸的需求。"jQuery图片裁切+PHP文件上传"方案就是解决此类问题的一个高效工具,...
PHP 文件上传后缀名与文件类型对照表详解 PHP 文件上传后缀名与文件类型对照表是指在 PHP 文件上传过程中,服务器端对上传文件的类型进行识别和限制的对照表。本文将详细解释该对照表的内容和用途。 标题解释 -php...
PHP 文件上传后缀名与文件类型对照表详解 PHP 文件上传是 Web 开发中常见的功能之一,当用户上传文件时,我们需要对文件类型进行判断和限制,以确保上传的文件安全和合法。为此,我们需要了解各种文件类型的后缀名...
**jQuery 文件上传技术详解** 在Web开发中,文件上传是一个常见的功能,特别是在用户需要提交图片、文档等数据时。jQuery,作为一个广泛使用的JavaScript库,提供了许多方便的插件来简化这个过程,使得文件上传变得...
以下是对PHP文件上传原理与实现方法的详细解析: 首先,了解文件上传的原理。当用户通过HTML表单选择文件并提交时,浏览器会将文件作为二进制数据封装在HTTP请求中,以`multipart/form-data`的格式发送。PHP服务器...
**Ajax 文件上传技术详解** 在Web开发中,用户经常需要上传文件,如图片、文档等。传统的文件上传方式是通过表单提交,页面会跳转或者刷新,这在用户体验上并不理想。Ajax技术的出现改变了这一情况,它使得在不刷新...
【PHP笔试面试题详解】 在准备PHP的面试或笔试时,了解并掌握这些常见问题至关重要。以下是对给定题目的一些详细解释: 1. **抓取远程图片到本地**:在PHP中,可以使用`fsockopen`或者`file_get_contents`结合`...
upload_url: "upload.php", // 服务器端处理上传的PHP文件 file_size_limit : "10 MB", // 文件大小限制 file_types : "*.jpg;*.jpeg;*.gif;*.png", // 允许上传的文件类型 ... }; swfu = new SWFUpload...
本文将针对不同的业务场景,介绍几种实用的PHP文件上传后端处理技巧。 #### 二、业务场景分析与技巧介绍 **场景一:单个文件上传** 1. **特点**: 只需要上传单个文件,且无需即时验证。 2. **技巧**: - 将文件...
### JavaScript基础知识点详解 #### 一、脚本语言概述 **1.1 什么是脚本语言** 脚本语言(Scripting Language)是一种轻量级的编程语言,它使用ASCII字符编写,无需像C语言或Java那样经过编译过程转换为二进制...
"js+php无刷新上传"是一个技术主题,主要涉及使用JavaScript(具体为jQuery库)和PHP实现文件的无刷新上传。在传统的文件上传方式中,用户通常需要提交整个表单,页面会刷新以显示上传结果。而无刷新上传,即AJAX...
模板文件通过调用PHP代码来动态生成内容,并通过CSS和JavaScript进行样式和交互设计。 #### 四、总结 通过上述介绍可以看出,Discuz!x的目录结构清晰,每个目录都有明确的功能定位。这种结构设计使得开发者能够...
SWFUpload 通过事件驱动机制与JavaScript进行交互,例如在文件开始上传、上传进度更新、文件上传成功或失败时触发相应的JavaScript函数,这样开发者可以根据需要定制上传过程中的反馈和行为。 7. **自定义外观** ...
【PHP文件管理系统详解】 在IT领域,PHP是一种广泛使用的服务器端脚本语言,尤其在构建动态网站和Web应用程序方面有着显著的优势。本文将深入探讨基于PHP的文件管理系统,旨在帮助开发者理解和实现这样的系统。 ...
**SWFUpload 文件上传控件详解** 在网页开发中,文件上传功能是不可或缺的一部分,而SWFUpload就是一款优秀的文件上传控件。它利用Flash技术,提供了多文件上传和进度显示的功能,使得用户在上传大文件或多个文件时...
JS(JavaScript)与PHP结合实现文件上传功能是一种常见的网页开发需求,其中前台使用JavaScript处理用户界面交互,后台则由PHP来处理文件接收和存储。本文将详细介绍如何结合这两者来实现完整的文件上传功能。 ### ...
例如,PHP文件`json.php`通过`json_encode`函数处理数组并输出到页面上: ```php <?php $arr=array( 'name'=>'我们', 'nick'=>'Gonn', 'contact'=>array( 'email'=>'***', 'website'=>'//***', ) ); $json_...
《多文件上传之Uploadify详解》 在当前的互联网应用中,用户经常需要上传多个文件,比如图片、文档等。为了提高用户体验,多文件上传功能变得尤为重要。Uploadify是一款广泛使用的JavaScript插件,它允许用户方便地...
接着,通过JavaScript设置Uploadify的配置参数,如上传的SWF文件路径、服务器端处理文件的脚本、取消按钮的图片、上传目录等: ```javascript $("#uploadify").uploadify({ 'uploader': 'JS/jquery.uploadify-v...