在实际开发中,我们经常需要文件上传功能。一个很棒的例子是BlueImpd的File Upload控件(https://github.com/blueimp/jQuery-File-Upload),它使用了jQuery和jQuery UI(或者Bootstrap)。它们的API都非常简单,这也使指令变得非常简单。
directive.js
angular.module('myApp.directives', []) .directive('fileupload', function() { return { restrict:'A', scope: { done: '&', progress: '&' }, link: function(scope, element, attrs) { var optionsObj = { dataType: 'json' }; if(scope.done) { optionsObj.done = function(e, data) { scope.$apply(function() { scope.done({e: e, data: data}); }); }; } if(scope.progress) { optionsObj.progress = function(e, data) { scope.$apply(function() { scope.progress({e: e, data: data}); }); }; } //以上内容可以简单地在一个循环中完成,这里是为了覆盖Fileupload控件所提供的API element.fileupload(optionsObj); } }; });
这段代码允许我们用一种很简单的方式来定义指令,并为onDone和onProgress添加引用。我们使用了函数绑定的方式,这样AngularJS总是能够使用正确的作用域调用正确的方法。
这是通过定义独立的scope来实现的,它上面绑定了两个函数,一个是progress,另一个是done。以上代码会在scope上创建一个函数,这个函数带有一个参数(一个object)。例如,scope.done带有一个object型的参数,该object上有两个key,分别是e和data,它们会被当作参数传递给原来的函数。
index.jsp
<!DOCTYPE html> <html ng-app="myApp"> <head lang="en"> <meta charset="utf-8"></meta> <title>File Upload With AngularJS</title> <!-- 由于我们在加载AngularJS之前会加载jQuery,所以Angular将会使用jQuery库来代替自已的jQueryLite实现 --> <script src="jquery/jquery-1.8.3.js"></script> <script src="jQuery-File-Upload/jquery.ui.widget.js"></script> <script src="jQuery-File-Upload/jquery.iframe-transport.js"></script> <script src="jQuery-File-Upload/jquery.fileupload.js"></script> <script src="jQuery-File-Upload/jquery.xdr-transport.js"></script> <script src="angular/angular.js"></script> <script src="controller.js"></script> <script src="directive.js"></script> </head> <body ng-controller="MainCtrl"> File Upload: <!-- 我们会在MainCtrl中定义uploadFinished,然后把它绑定到作用域上,所以在这里它已经是可用的了 --> <input id="testUpload" type="file" fileupload name="files[]" data-url="servlet/Upload" multiple done="uploadFinished(e, data)" progress="uploading(e, data)"></input> </body> </html>
input标签带有以下新增的属性:
a.fileupload
此属性让input标签成为了一个文件上传元素。
b.data-url
FileUpload插件使用此属性来决定把文件上传到哪里。在我们的例子中,我们上传到server API在servlet/Upload路径上等待处理插件所发送的数据。
c.multiple
multiple属性告诉指令(以及fileupload控件)允许一次选择多份文件。我们可以从插件中获得此功能,而且不用编写额外的代码,这是内置插件提供的又一项福利。
d.done
这是当插件文件上传之后需要调用的AngularJS函数。它同时还会指定调用指令时所需要的两个参数。
e.progress
同done
controller.js
var app = angular.module("myApp", ['myApp.directives']); app.controller('MainCtrl', function($scope) { $scope.uploadFinished = function(e, data) { console.log('We just finished uploading this baby...'); }; $scope.uploading = function(e, data) { var progress = parseInt(data.loaded / data.total * 100, 10); console.log(progress + '%'); }; });
运行效果:
点击“选择文件”,弹出如下选择框
选择文件
我们在服务器的控制台及浏览器的console上能看到上传的信息。也可以到服务器的上传目录下找到刚上传的文件,如下所示:
有了它之后,我们就拥有了一个简单的、可运行的、可复用的文件上传指令。
附:
1.后台应用服务代码
Upload.java
package com.bijian.study; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @SuppressWarnings("serial") public class Upload extends HttpServlet { @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String savePath = this.getServletConfig().getServletContext().getRealPath(""); savePath = savePath + "/uploads/"; File f1 = new File(savePath); System.out.println(savePath); if (!f1.exists()) { f1.mkdirs(); } DiskFileItemFactory fac = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(fac); upload.setHeaderEncoding("utf-8"); List fileList = null; try { fileList = upload.parseRequest(request); } catch (FileUploadException ex) { return; } Iterator<FileItem> it = fileList.iterator(); String name = ""; String extName = ""; while (it.hasNext()) { FileItem item = it.next(); if (!item.isFormField()) { name = item.getName(); long size = item.getSize(); String type = item.getContentType(); System.out.println(size + " " + type); if (name == null || name.trim().equals("")) { continue; } // 扩展名格式: if (name.lastIndexOf(".") >= 0) { extName = name.substring(name.lastIndexOf(".")); } File file = null; do { // 生成文件名: name = UUID.randomUUID().toString(); file = new File(savePath + name + extName); } while (file.exists()); File saveFile = new File(savePath + name + extName); try { item.write(saveFile); } catch (Exception e) { e.printStackTrace(); } } } response.getWriter().print(name + extName); } }web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>upload</servlet-name> <servlet-class>com.bijian.study.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>upload</servlet-name> <url-pattern>/servlet/Upload</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>2.工程目录结构
说明:jquery.xdr-transport.js在IE下应载入此文件解决跨域问题。
资料来源:《用AngularJS开发下一代Web应用》
jQuery-File-Upload学习资料:http://avnpc.com/pages/single-file-upload-component-by-jquery-file-upload
相关推荐
在jQuery-File-Upload中,FormData用于封装上传文件和相关参数,然后通过Ajax发送到服务器。 ### 使用步骤 1. **引入依赖**:首先需要在页面中引入jQuery库和jQuery-File-Upload插件的JavaScript和CSS文件。 2. **...
**jQuery File Upload 知识点详解** `jQuery File Upload` 是一个流行的JavaScript库,它允许用户在网页上实现多文件上传功能,特别是支持跨域上传,这对于现代Web应用来说至关重要。该框架以其易于使用、高度可...
**jQuery File Upload插件详解** `jQuery File Upload`是一款广泛使用的、功能强大的jQuery插件,专为实现优雅、高效且用户友好的文件上传功能而设计。这个插件以其易用性、灵活性和丰富的自定义选项著称,尤其适用...
本项目名为"jersey-file-upload-sample",它是一个使用JAX-RS Jersey框架和jQuery File Upload库实现的简单文件上传应用示例。这个应用程序的目的是展示如何在Java Web环境中处理文件上传请求,特别是在客户端使用...
"jQuery File Upload" 是一个非常流行的、高度可定制的文件上传解决方案,它为开发者提供了简单而强大的API来处理文件上传任务。这个插件在描述中被称为"upload封装好的插件,非常实用",说明它在简化文件上传操作...
在Web开发中,jQuery AJAX File Upload 是一个常见且实用的技术,它允许用户在不刷新整个页面的情况下上传文件。这一技术极大地提升了用户体验,因为用户可以一边浏览网页,一边进行文件上传,提高了交互性和效率。...
在这个"ASP.NET-file-upload.rar"压缩包中,我们关注的核心知识点是ASP.NET中的文件上传功能,这是一个常见的需求,尤其在需要用户提交图片、文档或其他类型文件的Web应用中。 文件上传功能在ASP.NET中通常通过...
本项目"基于weui图片上传封装插件"是个人原创的,针对使用jQueryWeui框架的前端开发者,提供了一个实用且方便的图片上传解决方案。这个插件的核心功能在于将图片上传的过程进行封装,使得开发者无需深入了解上传技术...
本文将深入探讨“JS上传图片插件”的相关知识点,以及如何使用jQuery-File-Upload-9.5.6这个插件来实现图片上传功能。 一、JavaScript图片上传基础 1. HTML5 File API:现代浏览器支持File API,使得通过...
《jQuery File Upload:基于jQuery的图片上传组件详解》 在Web开发中,用户交互体验是至关重要的,尤其是在处理文件上传时。jQuery File Upload是一个强大的、易于使用的插件,它允许用户方便地上传图片,同时也...
在实现这一功能时,通常会使用HTML5的FormData对象,它可以封装文件和表单数据,然后通过XMLHttpRequest(或者jQuery的$.ajax方法)发送到服务器。服务器端的处理可能涉及图像的预处理(如缩略图生成)、元数据的...
<script src="jQuery-File-Upload-8.8.2/js/vendor/jquery.ui.widget.js"> <script src="jQuery-File-Upload-8.8.2/js/jquery.iframe-transport.js"> <script src="jQuery-File-Upload-8.8.2/js/jquery....
压缩包中的`blueimp-jQuery-File-Upload-5f6bc7f`很可能就是该插件的某个版本。 8. **服务器端处理**:无论是否使用插件,服务器端都需要处理上传的文件,这可能涉及到文件存储、权限验证、大小限制、类型检查等多...
`jquery-html5-uploader`就是这样一个库,它封装了HTML5的File API,提供了一套简洁的API和方法,以便在jQuery环境中实现复杂的文件上传功能。 ### 3. `jquery-html5-uploader`核心功能 - **多文件选择**:HTML5的...
JQueryUpLoad,这个文件名可能是使用jQuery库实现的一个上传组件。jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画以及Ajax交互。结合jQuery来实现文件上传,可以使得代码更加简洁易懂,同时...
这个示例项目名为"jQuery-File-Upload.MVC5-master",它结合了jQuery File Upload插件与ASP.NET MVC5的强大力量,为用户提供了一种高效且友好的文件上传体验。 首先,让我们了解MVC5的基本概念。ASP.NET MVC5是微软...
在网页开发中,文件上传功能是常见的需求,jQuery Upload通过封装复杂的HTML5 File API,使得开发者能够轻松地在网站上实现这一功能。 **jQuery** 是一个轻量级的JavaScript库,它简化了HTML文档遍历、事件处理、...
4. **事件处理**:jQuery File Upload组件提供了一系列的事件,如fileuploadstart、fileuploadprogress、fileuploadcomplete等,开发者可以监听这些事件来处理上传过程中的各种状态,如显示进度条、错误提示等。...
这个基于"blueimp-jQuery-File-Upload-3c5d440"的插件,充分利用了这些技术的优势,为用户提供了一种直观且高效的文件上传体验。 首先,HTML5在其中起到了重要的角色。它的File API允许浏览器直接访问用户的本地...