thinkjs与Fine Uploader的邂逅
- /**
- * controller
- * @return
- */
- module.exports = Controller("Home/BaseController", function(){
- "use strict";
- return {
- indexAction: function(){
- this.display();
- },
- uploadFileAction: function() {
- var self = this;
- var fileInfo = this.file('qqfile');
- //http://www.thinkjs.org/doc/http.html#上传的文件
- /*
- //fileInfo的值
- {
- fieldName: 'qqfile',
- originalFilename: '1.jpg',
- path: '/home/maoshuai/htdocs/mtyras/App/Runtime/Temp/23886-1c2xozp.jpg',
- headers:
- { 'content-disposition': 'form-data; name="qqfile"; filename="1.jpg"',
- 'content-type': 'image/jpeg' },
- ws:
- { _writableState:
- { highWaterMark: 16384,
- objectMode: false,
- needDrain: false,
- ending: true,
- ended: true,
- finished: true,
- decodeStrings: true,
- defaultEncoding: 'utf8',
- length: 0,
- writing: false,
- sync: false,
- bufferProcessing: false,
- onwrite: [Function],
- writecb: null,
- writelen: 0,
- buffer: [],
- errorEmitted: false },
- writable: true,
- domain: null,
- _events: { error: [Object], close: [Object] },
- _maxListeners: 10,
- path: '/home/maoshuai/htdocs/mtyras/App/Runtime/Temp/23886-1c2xozp.jpg',
- fd: null,
- flags: 'w',
- mode: 438,
- start: undefined,
- pos: undefined,
- bytesWritten: 28618,
- closed: true },
- size: 28618
- }*/
- if(fileInfo) {
- self.json({
- error: 0,
- errmsg: 'ok',
- success: true //只有success返回true才认为上传成功
- });
- }else {
- self.error();
- }
- }
- };
- });
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <link rel="stylesheet" href="http://s7.qhimg.com/!f33a50ea/fine-uploader.css">
- <title>Fine Uploader与thinkjs的邂逅</title>
- </head>
- <body>
- <div id="fine-uploader-wrapper">
- <div class="qq-uploader-selector qq-uploader">
- <div class="qq-total-progress-bar-container-selector qq-total-progress-bar-container">
- <div class="qq-total-progress-bar-selector qq-progress-bar qq-total-progress-bar"></div>
- </div>
- <div class="qq-upload-drop-area-selector qq-upload-drop-area" qq-hide-dropzone>
- <span>拖拽上传区域</span>
- </div>
- <div class="qq-upload-button-selector qq-upload-button">
- <div>选择文件</div>
- </div>
- <span class="qq-drop-processing-selector qq-drop-processing">
- <span>上传进度</span>
- <span class="qq-drop-processing-spinner-selector qq-drop-processing-spinner"></span>
- </span>
- <ul class="qq-upload-list-selector qq-upload-list">
- <li>
- <div class="qq-progress-bar-container-selector">
- <div class="qq-progress-bar-selector qq-progress-bar"></div>
- </div>
- <span class="qq-upload-spinner-selector qq-upload-spinner"></span>
- <span class="qq-edit-filename-icon-selector qq-edit-filename-icon"></span>
- <span class="qq-upload-file-selector qq-upload-file"></span>
- <input class="qq-edit-filename-selector qq-edit-filename" tabindex="0" type="text">
- <span class="qq-upload-size-selector qq-upload-size"></span>
- <a class="qq-upload-cancel-selector qq-upload-cancel" href="#">取消</a>
- <a class="qq-upload-retry-selector qq-upload-retry" href="#">重试</a>
- <a class="qq-upload-delete-selector qq-upload-delete" href="#">删除</a>
- <span class="qq-upload-status-text-selector qq-upload-status-text"></span>
- </li>
- </ul>
- </div>
- </div>
- <button id="upload-btn">上传按钮</button>
- <script type="text/javascript" src="http://s8.qhimg.com/!240a7702/fine-uploader.js"></script>
- <script type="text/javascript">
- //具体参数参考源码qq.FineUploaderBasic中的_options查看
- var uploader = new qq.FineUploader({
- element: document.getElementById("fine-uploader-wrapper"), //上传按钮
- request: {
- endpoint: 'test/uploadFile' //上传接口地址
- },
- multiple: false, //是否多个文件
- autoUpload: false, //是否支持上传
- validation: {
- allowedExtensions: ['jpeg', 'jpg', 'png'], //上传文件约束条件
- sizeLimit: 2048000 //bytes 2000KB
- },
- callbacks: {
- onSubmit: function(id, fileName) {
- //文件开始提交
- console.log(fileName,'文件开始提交');
- },
- onUpload: function(id, fileName) {
- //文件开始上传
- console.log(fileName,'文件开始提交');
- },
- onProgress: function(id, fileName, loaded, total) {
- //文件正在上传
- console.log(fileName,'已上传'+(loaded/total)*100+'%');
- },
- onComplete: function(id, fileName, responseJSON) {
- //文件上传成功
- console.log(fileName,'上传成功,返回信息为:',responseJSON);
- },
- onCancel: function(id, fileName) {
- //取消文件上传
- console.log('取消',fileName,'上传');
- }
- },
- messages: {
- noFilesError: '没有选中文件'
- },
- text: {
- formatProgress: "{percent}% of {total_size}",
- failUpload: "上传失败",
- waitingForResponse: "上传中...",
- paused: "暂停"
- },
- template: 'fine-uploader-wrapper', //ID
- debug: true
- });
- document.getElementById('upload-btn').onclick = function() {
- uploader.uploadStoredFiles();
- }
- </script>
- </body>
- </html>
- $(dom).fineUploader(conf);
- new qq.FineUploader(conf);
- this._options = {
- debug: false,
- button: null,
- multiple: true,
- maxConnections: 3,
- disableCancelForFormUploads: false,
- autoUpload: true,
- request: {
- endpoint: "/server/upload",
- params: {},
- paramsInBody: true,
- customHeaders: {},
- forceMultipart: true,
- inputName: "qqfile",
- uuidName: "qquuid",
- totalFileSizeName: "qqtotalfilesize",
- filenameParam: "qqfilename"
- },
- validation: {
- allowedExtensions: [],
- sizeLimit: 0,
- minSizeLimit: 0,
- itemLimit: 0,
- stopOnFirstInvalidFile: true,
- acceptFiles: null,
- image: {
- maxHeight: 0,
- maxWidth: 0,
- minHeight: 0,
- minWidth: 0
- }
- },
- callbacks: {
- onSubmit: function(id, name) {},
- onSubmitted: function(id, name) {},
- onComplete: function(id, name, responseJSON, maybeXhr) {},
- onAllComplete: function(successful, failed) {},
- onCancel: function(id, name) {},
- onUpload: function(id, name) {},
- onUploadChunk: function(id, name, chunkData) {},
- onUploadChunkSuccess: function(id, chunkData, responseJSON, xhr) {},
- onResume: function(id, fileName, chunkData) {},
- onProgress: function(id, name, loaded, total) {},
- onTotalProgress: function(loaded, total) {},
- onError: function(id, name, reason, maybeXhrOrXdr) {},
- onAutoRetry: function(id, name, attemptNumber) {},
- onManualRetry: function(id, name) {},
- onValidateBatch: function(fileOrBlobData) {},
- onValidate: function(fileOrBlobData) {},
- onSubmitDelete: function(id) {},
- onDelete: function(id) {},
- onDeleteComplete: function(id, xhrOrXdr, isError) {},
- onPasteReceived: function(blob) {},
- onStatusChange: function(id, oldStatus, newStatus) {},
- onSessionRequestComplete: function(response, success, xhrOrXdr) {}
- },
- messages: {
- typeError: "{file} has an invalid extension. Valid extension(s): {extensions}.",
- sizeError: "{file} is too large, maximum file size is {sizeLimit}.",
- minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.",
- emptyError: "{file} is empty, please select files again without it.",
- noFilesError: "No files to upload.",
- tooManyItemsError: "Too many items ({netItems}) would be uploaded. Item limit is {itemLimit}.",
- maxHeightImageError: "Image is too tall.",
- maxWidthImageError: "Image is too wide.",
- minHeightImageError: "Image is not tall enough.",
- minWidthImageError: "Image is not wide enough.",
- retryFailTooManyItems: "Retry failed - you have reached your file limit.",
- onLeave: "The files are being uploaded, if you leave now the upload will be canceled.",
- unsupportedBrowserIos8Safari: "Unrecoverable error - this browser does not permit file uploading of any kind due to serious bugs in iOS8 Safari. Please use iOS8 Chrome until Apple fixes these issues."
- },
- retry: {
- enableAuto: false,
- maxAutoAttempts: 3,
- autoAttemptDelay: 5,
- preventRetryResponseProperty: "preventRetry"
- },
- classes: {
- buttonHover: "qq-upload-button-hover",
- buttonFocus: "qq-upload-button-focus"
- },
- chunking: {
- enabled: false,
- concurrent: {
- enabled: false
- },
- mandatory: false,
- paramNames: {
- partIndex: "qqpartindex",
- partByteOffset: "qqpartbyteoffset",
- chunkSize: "qqchunksize",
- totalFileSize: "qqtotalfilesize",
- totalParts: "qqtotalparts"
- },
- partSize: 2000000,
- // only relevant for traditional endpoints, only required when concurrent.enabled === true
- success: {
- endpoint: null
- }
- },
- resume: {
- enabled: false,
- recordsExpireIn: 7, //days
- paramNames: {
- resuming: "qqresume"
- }
- },
- formatFileName: function(fileOrBlobName) {
- if (fileOrBlobName !== undefined && fileOrBlobName.length > 33) {
- fileOrBlobName = fileOrBlobName.slice(0, 19) + "..." + fileOrBlobName.slice(-14);
- }
- return fileOrBlobName;
- },
- text: {
- defaultResponseError: "Upload failure reason unknown",
- sizeSymbols: ["kB", "MB", "GB", "TB", "PB", "EB"]
- },
- deleteFile: {
- enabled: false,
- method: "DELETE",
- endpoint: "/server/upload",
- customHeaders: {},
- params: {}
- },
- cors: {
- expected: false,
- sendCredentials: false,
- allowXdr: false
- },
- blobs: {
- defaultName: "misc_data"
- },
- paste: {
- targetElement: null,
- defaultName: "pasted_image"
- },
- camera: {
- ios: false,
- // if ios is true: button is null means target the default button, otherwise target the button specified
- button: null
- },
- // This refers to additional upload buttons to be handled by Fine Uploader.
- // Each element is an object, containing `element` as the only required
- // property. The `element` must be a container that will ultimately
- // contain an invisible `<input type="file">` created by Fine Uploader.
- // Optional properties of each object include `multiple`, `validation`,
- // and `folders`.
- extraButtons: [],
- // Depends on the session module. Used to query the server for an initial file list
- // during initialization and optionally after a `reset`.
- session: {
- endpoint: null,
- params: {},
- customHeaders: {},
- refreshOnReset: true
- },
- // Send parameters associated with an existing form along with the files
- form: {
- // Element ID, HTMLElement, or null
- element: "qq-form",
- // Overrides the base `autoUpload`, unless `element` is null.
- autoUpload: false,
- // true = upload files on form submission (and squelch submit event)
- interceptSubmit: true
- },
- // scale images client side, upload a new file for each scaled version
- scaling: {
- // send the original file as well
- sendOriginal: true,
- // fox orientation for scaled images
- orient: true,
- // If null, scaled image type will match reference image type. This value will be referred to
- // for any size record that does not specific a type.
- defaultType: null,
- defaultQuality: 80,
- failureText: "Failed to scale",
- includeExif: false,
- // metadata about each requested scaled version
- sizes: []
- },
- workarounds: {
- iosEmptyVideos: true,
- ios8SafariUploads: true,
- ios8BrowserCrash: true
- }
- };
- multiple是否支持多文件上传
- autoUpload是否自动上传,就是说选中文件后,是否还需要手动点击上传按钮触发开始上传事件
- validation文件约束条件,包含文件格式、文件最大值、文件最小值
- callbacks各种回调函数,包含开始提交、开始上传、正在上传、上传成功、取消上传
- messages一些默认提示信息,可以将源文件的错误提示汉化调整,例子中只是i调整了noFilesError,业务可以根据自己需求进行配置
- template可以使用script模版或者dom模版,只要传模版的ID字符串或者dom对象
- debug这个就不用说了,为了开发调试使用,会记录详细的上传过程,便于查找问题出现的位置
thinkjs与Fine Uploader的邂逅的更多相关文章
- Fine Uploader文件上传组件
最近在处理后台数据时需要实现文件上传.考虑到对浏览器适配上采用Fine Uploader. Fine Uploader 采用ajax方式实现对文件上传.同时在浏览器中直接支持文件拖拽[对浏览器版本有要 ...
- [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传
原文 [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传 Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件 ...
- 用Fine Uploader+ASP.NET MVC实现ajax文件上传[代码示例]
Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件的 Javascript 组件. This project attempts to achi ...
- Fine Uploader 简单配置方法
由于jquery.uploadify是基于flash的jquery上传控件,客户老是说出问题,所以今天换成了一个纯js的异步上传控件. 这方面的资料很少,故此记下来分享一下. 项目地址:Fine Up ...
- web文件上传组件比较jQuery File Upload和Fine Uploader
jQuery File Upload: https://blueimp.github.io/jQuery-File-Upload/ Fine Uploader: http://fineuploader ...
- [Fine Uploader] 用Fine Uploader+ASP.NET MVC实现ajax文件上传[代码示例]
Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件的 Javascript 组件 This project attempts to ach ...
- 上传组件Fine Uploader在ASP.NET中的应用
现如今,世面上流行着许多前端上传组件,例如:Uploadify(http://www.uploadify.com/),Fine Uploader,等等.这篇博客从头开始,介绍如何在ASP.NET MV ...
- Fine Uploader + Spring3.2.2(Java+html5上传) SpringMVC+jquery-fineuploader 文件上传
需求:要实现多文件上传,且要支持手机等移动设备... springmvc文件上传真头疼,网上搜了半天没发现都是TMD的用submit按钮提交到后台的,就没有插件的吗?最后发现了fineUploader ...
- GitHub托管BootStrap资源汇总(持续更新中…)
Twitter BootStrap已经火过大江南北,对于无法依赖美工的程序员来说,这一成熟前卫的前端框架简直就一神器,轻轻松松地实现出专业的UI效果.GitHub上相关的的开源项目更是层出不穷,在此整 ...
随机推荐
- HBase二级索引的设计(案例讲解)
摘要 最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowK ...
- VB.NET中DataGridView控件
VB.NET中对于表格数据的显示经常使用到DataGridView控件,其以丰富多样的数据表呈现形式被程序猿喜爱. 本人在做一个小系统中运用DataGridView控件的部分属性,这些功能的使用在使用 ...
- LNMP、LAMP、LANMP一键安装脚本(定期更新)[转]
这个脚本是使用shell编写,为了快速在生产环境上部署LNMP/LAMP/LANMP(Linux.Nginx/Tengine.MySQL/MariaDB/Percona.PHP),适用于CentOS/ ...
- [CSS] :not Selector
The CSS :not() selector allows us to exclude a subset of elements matched by our selector. In this e ...
- Pig系统分析(6)-从Physical Plan到MR Plan再到Hadoop Job
从Physical Plan到Map-Reduce Plan 注:由于我们重点关注的是Pig On Spark针对RDD的运行计划,所以Pig物理运行计划之后的后端參考意义不大,这些部分主要分析流程, ...
- Android Fragment详解(三): 实现Fragment的界面
为fragment添加用户界面: Fragment一般作为activity的用户界面的一部分,把它自己的layout嵌入到activity的layout中. 一个 要为fragment提供layout ...
- 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...
- Asp.Net中的消息处理---MSMQ系列学习(一)
刚刚毕业一年,比较浮躁,上次面试被问到消息队列,觉得非常的惭愧因为不知道,所以下定决心一定要学会使用它.以前只是听说过有这么个东西,要说是什么,在什么场景下使用却是无从知晓,因为自己也确实没有在项目中 ...
- (转)js正则表达式之中文验证
今天做表单提交的输入框条件验证,验证是否包含中文:网上搜了一圈基于js正则表达式的验证基本不好用,而且大多都是出自一两篇原文的转帖!到底什么才是拿来主义呢.根据搜索结果,本文取精华,告诉大家一个好用的 ...
- 决策树简单介绍(二) Accord.Net中决策树的实现和使用
决策树介绍 决策树是一类机器学习算法,可以实现对数据集的分类.预测等.具体请阅读我另一篇博客(http://www.cnblogs.com/twocold/p/5424517.html). Accor ...