0

0

Fine Uploader文件上传组件应用介绍_PHP

php中文网

php中文网

发布时间:2016-06-01 12:08:24

|

1085人浏览过

|

来源于php中文网

原创

最近在处理后台数据时需要实现文件上传.考虑到对浏览器适配上采用fine uploader. fine uploader 采用ajax方式实现对文件上传.同时在浏览器中直接支持文件拖拽[对浏览器版本有要求类似ie版本必须是9或是更高的ie10].在不同浏览器中提供统一用户体验.该组件基本覆盖目前所有主流浏览器.同时没有任何第三方组件依赖.相当clear.在服务器端已经覆盖支持了asp.net/coldfusion/java/node.js/perl/php/python. 对上传细节类似限制文件大小,文件类型,文件上传的数量等通过统一接口以暴露选项方式操作.

看到github 上fine uploader 按照官方的说法. fine uploader前身是ajax upload. 新版本fine uploader主要添加一些新特性.从1.0版本发布的realse note来看.二者最大的区别在于.fine uploder不在基于jquery组件.而某些细节处理也更加统一严格.类似返回值全部统一为json格式.对后台服务器操作和前端dom对象一些操作code全部集中js script脚本文件中.这样集成使fine uploader组件使用非常简单.只需要添加一个css+javascript文件即可实现文件上传.大大简化用户引用和操作组件难度.

fine uploader特点如下:
fine uploader features:
a:支持文件上传进度显示.
b:文件拖拽浏览器上传方式
c:ajax页面无刷新.
d:多文件上传.
f:跨浏览器.
e:跨后台服务器端语言.
在git hub上fine uploader上下载打包源码,在php designer 8中打开其源码可以看到其源码结构如下:
2013-01-04_162943 
在根目录中可以看到client客户端调用需要使用文件.server目录则是对应不同语言perl/php/asp.net[vb]等版本实现.test目录则有包含一个完整本地sample demo.可供参考.
如何快速构建一个简单demo? 其实官方在basic-demo-page上已经给出一个简单的演示.这里基于bootstrap方式构建.
首先新建一个html空白页面.命名fineuploderdemo.html.添加如下css引用如下:
复制代码 代码如下:



这两个文件时必须引用的.fineuploader.css则是对应下载fine uploder源码client目录下.fineuploder.css 提供js脚本中所需的css样式,主要包括按钮的样式、进度显示的样式以及上传结果的样式.添加javascript文件引用如下:
复制代码 代码如下:
<script src="static/script/fineupload/header.js"></script>
<script src="static/script/fineupload/util.js"></script>
<script src="static/script/fineupload/button.js"></script>
<script src="static/script/fineupload/handler.base.js"></script>
<script src="static/script/fineupload/handler.form.js"></script>
<script src="static/script/fineupload/handler.xhr.js"></script>
<script src="static/script/fineupload/uploader.basic.js"></script>
<script src="static/script/fineupload/dnd.js"></script>
<script src="static/script/fineupload/uploader.js"></script>

其中uploder.js和uploder.basic.js则是前端的所有上传功能都在该脚本中实现.必须引用.
同时添加client目录下processing和loading两张进度显示所需要的动态图片.该图片都在fineuploder.css文件调用.
在body添加如下code:
复制代码 代码如下:

站长俱乐部购物系统
站长俱乐部购物系统

功能介绍:1、模块化的程序设计,使得前台页面设计与程序设计几乎完全分离。在前台页面采用过程调用方法。在修改页面设计时只需要在相应位置调用设计好的过程就可以了。另外,这些过程还提供了不同的调用参数,以实现不同的效果;2、阅读等级功能,可以加密产品,进行收费管理;3、可以完全可视化编辑文章内容,所见即所得;4、无组件上传文件,服务器无需安装任何上传组件,无需支持FSO,即可上传文件。可限制文件上传的类

下载

<script> <br>function createuploader() { <br>var uploader = new qq.fineuploader({ <br>element: document.getelementbyid('bootstrapped-fine-uploader'), <br>request: { <br>endpoint: 'server/handlerfunction' <br>}, <br>text: { <br>uploadbutton: '<i class="icon-upload icon-white"> click me now and upload a product image' <br>}, <br>template: <br>'<div class="qq-uploader span12">' + <br>'<pre class="qq-upload-drop-area span12">&lt;span&gt;{dragzonetext}&lt;/span&gt;</pre>' + <br>'<div class="qq-upload-button btn btn-success" style="width: auto;">{uploadbuttontext}' + <br>'<span class="qq-drop-processing"><span>{dropprocessingtext}'+ <br>'<span class="qq-drop-processing-spinner">' + <br>'<ul class="qq-upload-list" style="margin-top: 10px; text-align: center;">' + <br>'', <br>classes: { <br>success: 'alert alert-success', <br>fail: 'alert alert-error' <br>}, <br>debug: true <br>}); <br>} <br><br>window.onload = createuploader; <br></script>

这是基于bootstrap实现对fine uploader最简单的前端调用.前端一般需要做两件事a:添加css+js文件引用.b:在js中实例化qq.fineuploder对象.运行效果如下:
2013-01-04_170433 
查看js构建qq.fineuploader对象创建过程.首先指定fine uploader插件的dom元素.通过dom获取操作.request则是对应服务器端实现文件路径.在这建议不要自己构建服务器端处理.而是直接采用官方提供的实现文件修改即可.template则是对应上传文件添加内容模版也可以自己修改.debug是一个布尔值.用来控制是否使用浏览器的控制台打印fine uploader的调试信息,默认为false.
qq.fineuploader对象还有如下控制参数:
validation:该参数一般用来在执行上传文件操作前.在客户端做一些验证.验证操作包含文件格式.文件大小.等添加格式如下:
复制代码 代码如下:
validation:
{
allowedextensions: ['jpeg', 'jpg', 'gif', 'png'],
sizelimit: 204800 // 200 kb = 200 * 1024 bytes
}
allowedextensions控制上传文件的后缀格式数组.
sizelimit上传文件大小的上限,单位为byte的数值.浏览器不一定支持本设置.也可以在服务器端里设置.
minsizelimit:上传文件大小的下限,单位为byte的数值.同上有些浏览器存在适配问题.建议统一在服务端设置.
另外针对qq.fineuploder对象在执行上传操作整个过程.定义了五个客户端可控做额外操作的事件.可以再callback参数下设置定义:
callbacks:
{
onsubmit: function(id, filename) {
$messages.append('
');
},
onupload: function(id, filename) {
$('#file-' + id).addclass('alert-info')
.html('initializing. please hold. ' +
'initializing ' +
'“' + filename + '”');
}
}

onsubmit事件:文件开始提交.调用参数格式如下:onsubmit:function(id,filename){}.
onupload事件: 文件开始上传.调用参数格式如下:onupload: function(id, filename) {}.
onprogress事件: 文件正在上传.调用参数格式如下:onprogress:function(id,filename,loaded,total){}.
oncomplete事件: 文件上传成功. 调用参数格式如下:oncomplete:function(id,filename,responsejson){}.
oncancel事件: 取消文件上传.调用参数格式如下:oncancel:function(id,filename){}.
如上五个事件基本覆盖整个上传文件操作中所有过程.完全以开放的形式可以再客户端操作.关于调用如上事件参数说明如下:
id:表示第几个开始上传的文件.fine uploder定义是默认从0开始计数.
filename:上传文件的文件名.
loaded:表示已经上传到服务器端数据的大小[byte].
total: 需要上传文件的大小.
responsejson: 用来在上传操作完成后返回的json格式的数据.通过jquery反序列化出来对象.其中包含一个issuccess属性用来判断此次上传是否成功.
如果你想在上传过程向服务器端传递数据.可以通过如下参数控制:
params:用来向服务器端传递数据.注意params采用key-value的数组存储.采用post方式发送给服务器端.一般传递参数格式如下:
复制代码 代码如下:
params:
{
argument1: "value1",
argument2: "value2"
},

ok.这时基本关于fine uploader客户端初始化和控制操作选项基本完成.当我们需要上传操作时.如果isauto=false时可以通过已经定义qq.fineuploader对象的uploadstorefiles()方式手工触发上传操作:
复制代码 代码如下:
$('#triggerupload').click(function() {
uploader2.uploadstoredfiles();
});

如果我们此时点击上传会发现.则提示上传失败. 因为还没有对上传服务器端做任何处理:
复制代码 代码如下:
request:
{
endpoint: 'server/handlerfunction'
},

这时我们需要在endpoint指定处理文件上传的php文件[这里是phpdemo].关于服务器端如果你没有已经成熟处理模块.还是推荐你使用官方server目录上.这里我采用php环境则选中时php.php文件.对应客户端修改如下:
复制代码 代码如下:
request:
{
endpoint: 'controller/php.php'
}

打开php.php发现在文件头部说明该文件使用同时在文件定义三个类用来分别处理xmlhttprequest、formpost、basicpost方式文件服务器端处理.在文件顶部注释中:
/****************************************
example of how to use this uploader class...
you can uncomment the following lines (minus the require) to use
hese as your defaults.

// list of valid extensions, ex. array("jpeg", "xml", "bmp")
$allowedextensions = array();
// max file size in bytes
$sizelimit = 10 * 1024 * 1024;
//the input name set in the javascript
$inputname = 'qqfile'

require('valums-file-uploader/server/php.php');
$uploader = new qqfileuploader($allowedextensions, $sizelimit, $inputname);

// call handleupload() with the name of the folder, relative to php's getcwd()
$result = $uploader->handleupload('uploads/');

// to pass data through iframe you will need to encode all html tags
header("content-type: text/plain");
echo htmlspecialchars(json_encode($result), ent_noquotes);

/******************************************/
已经详细说明如下class调用方式.添加如下php代码即可简单完成服务器端处理:
复制代码 代码如下:
$allowedextensions = array("jpeg", "jpg", "bmp", "png");
$sizelimit = 10 * 1024 * 1024;
$uploader = new qqfileuploader($allowedextensions, $sizelimit);
$result = $uploader->handleupload('uploads/'); //folder for uploaded files
echo htmlspecialchars(json_encode($result), ent_noquotes);

allowextensions则定义了允许上传文件的格式.
sizelimit上限定义为10m.注意首先采用phpinfo();方法输出当前php环境配置.一般默认情况默认上传文件最大大小为2m.如果你需要上传更大则修改php.ini文件配置参数 这里不再赘述.
uploder则是初始化qq.fileuploder对象.并加载配置.

fineuploder调用处理上传函数.并传递服务器端存储上传文件存储路径.
echo想服务器端输出上传结果.必须.不然客户端接受不到指定responsejason参数用来判断上传后状态.
在进一步看看服务器端如何处理上传的找到handleupload函数定义.
复制代码 代码如下:
/**
* handle the uploaded file
* @param string $uploaddirectory
* @param string $replaceoldfile=true
* @returns array('success'=>true) or array('error'=>'error message')
*/
function handleupload($uploaddirectory, $replaceoldfile = false){
if (!is_writable($uploaddirectory)){
return array('error' => "server error. upload directory isn't writable.");
}

if (!$this->file){
return array('error' => 'no files were uploaded.');
}

$size = $this->file->getsize();

if ($size == 0) {
return array('error' => 'file is empty');
}

if ($size > $this->sizelimit) {
return array('error' => 'file is too large');
}

$pathinfo = pathinfo($this->file->getname());
$filename = $pathinfo['filename'];
//$filename = md5(uniqid());
$ext = @$pathinfo['extension'];// hide notices if extension is empty

if($this->allowedextensions && !in_array(strtolower($ext), $this->allowedextensions)){
$these = implode(', ', $this->allowedextensions);
return array('error' => 'file has an invalid extension, it should be one of '. $these . '.');
}

$ext = ($ext == '') ? $ext : '.' . $ext;

if(!$replaceoldfile){
/// don't overwrite previous files that were uploaded
while (file_exists($uploaddirectory . directory_separator . $filename . $ext)) {
$filename .= rand(10, 99);
}
}

$this->uploadname = $filename . $ext;

if ($this->file->save($uploaddirectory . directory_separator . $filename . $ext)){
return array('success'=>true);
} else {
return array('error'=> 'could not save uploaded file.' .
'the upload was cancelled, or server error encountered');
}

}

在调用这个处理函数时.需要注意的是.传递的url存储路径需要时绝对的.所以需要对传入路劲做一下格式化处理:
$uploaddirectory = $_server['document_root']."ds".$uploaddirectory;
对于is_writeable文件是否可写的判断.我个人认为还不够详细.is_writeable主要判断文件或目录是否存在.并可写才会返回true. 所以个人建议在is_writable前添加一个文件是否存在.这样更易于在客户端判断服务器端文件出错具体的情况:
复制代码 代码如下:
if (!file_exists($uploaddirectory)) {
return array('error' => "server error. upload directory dones't exist.");
}

在保存文件操作前.可以看到.处理函数分别做了四次判断.分别判断了 上传文件的数量、文件上传的大小、文件上传大小是否超过上限、另外在上传过程.如果我们多次想服务器端上传同一个文件.发现fine uploder处理方式是.并非是重写.而是从10-99随机一个数字重写命名该文件.并保存到目录下.当保存文件成功后.则想服务器端返回一个json数据其中包含issuccess来指定此次上传操作是否操作成功. issuccess参数作为客户端判断此时操作唯一参数.

在上传操作过程发信很多出现“increase post_max_size and upload_max_filesize to 10m”错误,其实针对这个问题.主要是上传文件配置超过php环境默认的2m.需要在php.ini文件中把post_max_size和upload_max_filesize两项的值改到10m以上,然后重启apache即可.或是参考php官网针对配置说明 修改php.ini配置文件.
至此整个fine uploader配置流程已经全部完成.点击选择文件时.会如下效果:
2013-01-04_191128 
提示上传成功.当然更多的请参考官方给出演示demo.如上从fine uploader源码角度分析其实现原理.

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

62

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

6

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

9

2026.02.25

Python数据处理流水线与ETL工程实战
Python数据处理流水线与ETL工程实战

本专题聚焦 Python 在数据工程场景下的实际应用,系统讲解 ETL 流程设计、数据抽取与清洗、批处理与增量处理方案,以及数据质量校验与异常处理机制。通过构建完整的数据处理流水线案例,帮助开发者掌握数据工程中的性能优化思路与工程化规范,为后续数据分析与机器学习提供稳定可靠的数据基础。

0

2026.02.25

Java领域驱动设计(DDD)与复杂业务建模实战
Java领域驱动设计(DDD)与复杂业务建模实战

本专题围绕 Java 在复杂业务系统中的建模与架构设计展开,深入讲解领域驱动设计(DDD)的核心思想与落地实践。内容涵盖领域划分、聚合根设计、限界上下文、领域事件、贫血模型与充血模型对比,并结合实际业务案例,讲解如何在 Spring 体系中实现可演进的领域模型架构,帮助开发者应对复杂业务带来的系统演化挑战。

0

2026.02.25

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

18

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

9

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

6

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

5

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 4.5万人学习

Excel 教程
Excel 教程

共162课时 | 18.8万人学习

React 教程
React 教程

共58课时 | 5.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号