在项目开发过程中,经常会遇到文件上传下载的问题。但在flex中由于安全沙箱的原因,flex程序不能直接访问本地文件。但是flex SDK中提供了FileReference和FileReferenceList两个类,可以通过这两个类来实现,这两个类位于flash.net包中。
一、 文件上传
上传文件flex端处理:
1、上传文件第一步——打开文件。
首先需要创建一个FileReference对象:
private var myFileReference:FileReference = new FileReference();
在FileReference中有一个browse()函数,这个函数的作用就是打开一个windows文件选择框,可以选择需要上传的文件。在打开的文件选择框中可以指定选择文件的类型,这是通过FileFilter来实现的。创建一个FileFilter对象,作为browse函数的参数,这样就可以指定选择文件的类型了:
var imagesFilter:FileFilter = new FileFilter("Images(*.jpg,*.gif,*.png)", "*.jpg;*.gif;*.png");
myFileReference.browse([imagesFilter]);
2、上传文件第二步——上传文件
文件选择了之后会触发Event.SELECT事件,所以需要在myFileReference对象上注册SELECT事件的监听:
myFileReference.addEventListener(Event.SELECT, onSelect);
onSelect是一个监听函数,在这个函数中可以得到选择的文件的名字。由于安全沙箱的原因,只能得到选择的文件名,不能得到完整的文件路径。选择了需要上传的文件后,需要调用upload()函数上传选择的文件:
myFileReference.upload(uploadURL,myFileReference.name);
upload的参数uploadURL是一个URLRequest对象,这个对象指定了上传文件用的URL,myFileReference.name就是选择的文件的文件名。
3、上传文件第三步——上传进度
一般情况下,在上传文件的过程中需要显示一个表示上传进度的进度条,这样可以有一个很好的用户体验。要想显示上传进度,可以有两种方式。第一种就是监听FileReference对象的process事件,在process事件的监听函数中可以得到上传的进度,然后可以设置进度条的进度。第二种方式就是把FileReference对象与进度条对象进行绑定,进度条会自动监听FileReference对象的process事件,来显示上传进度。
4、上传文件第四步——上传结束
有的时候需要在文件上传结束后给用户一个提示,告诉用户文件已经上传结束了。这就必须得对FileReference对象的COMPLETE事件进行监听,当文件上传结束后,会触发COMPLETE事件。用户提示或者文件上传结束后的处理需要在这个事件的监听函数中实现。
文件上传服务器端处理:
FileReference对象的upload函数上传到服务器端的格式如下:
POST /handler.cfm HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
User-Agent: Shockwave Flash
Host: www.example.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Filename"
MyFile.jpg
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="photo"; filename="MyFile.jpg"
Content-Type: application/octet-stream
上传文件的内容
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
Content-Disposition: form-data; name="Upload"
Submit Query
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7—
服务器端只需要解析这个结构,把“上传文件内容”部分解析出来,然后保存成文件就可以了。文件名就是MyFile.jpg。
服务器端java代码:
view plaincopy to clipboardprint?
private boolean upLoad(HttpServletRequest request) throws Exception {
int len = -1;
byte[] bt = new byte[4096];
String sperator = null;
String fileName = null;
String savePath = "/";
//控制上传文件的大小
long fileSize = -1;
request.setCharacterEncoding("utf-8");
ServletInputStream in = request.getInputStream();
len = in.readLine(bt, 0, bt.length);
if (len != -1) {
sperator = new String(bt, 0, len);
System.out.println(sperator);
speratorsperator = sperator.substring(0, 28);
System.out.println(sperator);
len = -1;
}
do {
len = in.readLine(bt, 0, bt.length);
String s = new String(bt, 0, len);
System.out.println(s);
int index = s.indexOf("filename=\"");
if (index != -1) {
ss = s.substring(index + 10);
index = s.indexOf("\"");
ss = s.substring(0, index);
fileName = s;
len = -1;
}
} while (len != -1);
FileOutputStream out = new FileOutputStream(savePath + fileName);
len = in.readLine(bt, 0, bt.length);
String s = new String(bt, 0, len);
System.out.println(s);
int i = s.indexOf("Content-Type:");
if (i == -1) {
System.out.print("is not file");
return false;
} else {
in.readLine(bt, 0, bt.length); // delete one line space
len = -1;
}
long trancsize = 0;
try {
len = in.readLine(bt, 0, bt.length);
while (len != -1) {
s = new String(bt, 0, len);
if (s.length() > 28) {
ss = s.substring(0, 28);
if (s.equals(sperator)) {
System.out.println(s);
break;
}
}
if (fileSize != -1) {
if (trancsize >= fileSize) {
throw new Exception("file is too big");
}
}
out.write(bt, 0, len);
trancsize += len;
len = in.readLine(bt, 0, bt.length);
}
out.close();
return true;
} catch (Exception e) {
out.close();
File tmp = new File(savePath, fileName);
if (!tmp.delete()) {
System.out.println(e.getMessage() + ",clear error");
}
return false;
}
}
private boolean upLoad(HttpServletRequest request) throws Exception {
int len = -1;
byte[] bt = new byte[4096];
String sperator = null;
String fileName = null;
String savePath = "/";
//控制上传文件的大小
long fileSize = -1;
request.setCharacterEncoding("utf-8");
ServletInputStream in = request.getInputStream();
len = in.readLine(bt, 0, bt.length);
if (len != -1) {
sperator = new String(bt, 0, len);
System.out.println(sperator);
sperator = sperator.substring(0, 28);
System.out.println(sperator);
len = -1;
}
do {
len = in.readLine(bt, 0, bt.length);
String s = new String(bt, 0, len);
System.out.println(s);
int index = s.indexOf("filename=\"");
if (index != -1) {
s = s.substring(index + 10);
index = s.indexOf("\"");
s = s.substring(0, index);
fileName = s;
len = -1;
}
} while (len != -1);
FileOutputStream out = new FileOutputStream(savePath + fileName);
len = in.readLine(bt, 0, bt.length);
String s = new String(bt, 0, len);
System.out.println(s);
int i = s.indexOf("Content-Type:");
if (i == -1) {
System.out.print("is not file");
return false;
} else {
in.readLine(bt, 0, bt.length); // delete one line space
len = -1;
}
long trancsize = 0;
try {
len = in.readLine(bt, 0, bt.length);
while (len != -1) {
s = new String(bt, 0, len);
if (s.length() > 28) {
s = s.substring(0, 28);
if (s.equals(sperator)) {
System.out.println(s);
break;
}
}
if (fileSize != -1) {
if (trancsize >= fileSize) {
throw new Exception("file is too big");
}
}
out.write(bt, 0, len);
trancsize += len;
len = in.readLine(bt, 0, bt.length);
}
out.close();
return true;
} catch (Exception e) {
out.close();
File tmp = new File(savePath, fileName);
if (!tmp.delete()) {
System.out.println(e.getMessage() + ",clear error");
}
return false;
}
}
代码补充说明:
解析request内容,把文件内容解析出来,然后保存成文件,文件名可以从request内容中解析出来。上传文件时如果想控制上传文件的大小的话就设定fileSize变量的值来进行控制。
二、文件下载
文件下载相对来说是比较简单的。只需三步就可以完成。
1、创建一个URLRequest对象
var downLoadURL:URLRequest = new URLRequest();
2、指定下载文件的URL
downLoadURL.url = "http://localhost:8080/FlexRemotObject/download";
3、执行FileReference对象的download函数。download函数的第一个参数就是在1中创建的URLRequest对象,第二个参数是下载的文件的默认文件名。
myFileReference.download(downLoadURL,"image.png");
以上三步执行完毕后,FileReference对象会打开一个文件保存对话框,指定一个路径后,点击保存按钮,文件就下载完成了。
文件下载Java端代码:
view plaincopy to clipboardprint?
private void downLoad(HttpServletResponse response) throws Exception {
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream("/head.PNG"));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff,0,bytesRead);
}
} catch(final IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}finally {
if (bis != null)
bis.close();
if (bos != null)
{
bos.flush();
bos.close();
bos=null;
}
}
response.flushBuffer();
}
private void downLoad(HttpServletResponse response) throws Exception {
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream("/head.PNG"));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff,0,bytesRead);
}
} catch(final IOException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}finally {
if (bis != null)
bis.close();
if (bos != null)
{
bos.flush();
bos.close();
bos=null;
}
}
response.flushBuffer();
}
结束语:如果想实现同时上传多个文件,那么可以使用FileReferenceList类来实现。
完整代码下载地址:http://download.csdn.net/source/1815266
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/To9m/archive/2009/11/10/4796105.aspx
分享到:
相关推荐
Flex上传下载功能在企业应用中十分常见,尤其是在处理大量数据交互时。Flex作为一个富客户端的开发框架,提供了强大的用户界面创建能力,同时支持与服务器之间的数据传输。在本主题中,我们将深入探讨如何使用Flex...
标题“FLEX上传下载的FLEX项目源码”暗示了这是一个包含实现文件上传和下载功能的FLEX项目源代码。FLEX中的上传下载功能是通过与服务器进行HTTP通信来实现的,通常涉及到XMLHttpRequest对象或者使用Flash Player的...
### Flex与Servlet结合实现文件上传及下载功能 在Flex与Servlet技术结合的背景下,本文将详细介绍如何通过这两种技术实现文件的上传与下载功能。通过分析提供的代码片段,我们可以看到一个典型的Flex应用程序界面...
本资源是“flex完全自学手册第24章 上传下载源码”,它包含了实现Flex中文件上传和下载功能的示例代码,帮助开发者深入理解和应用相关技术。 首先,让我们了解Flex中文件上传的基本原理。在Flex中,我们可以使用...
【SSH框架下的文件上传下载实现】 在J2EE开发中,文件上传下载是一个常见的功能,传统的解决方案如SmartUpload和Apache的FileUpload等虽然成熟,但在Struts+Spring+Hibernate(SSH)这一流行的Java企业级应用框架下...
建议使用描述中提到的修正版代码:“flex 文件上传下载完整代码(修正版)”,以获取更稳定、可靠的实现。 请注意,由于跨域安全限制,Flex的文件上传和下载功能可能会受到一些约束。在实际开发中,需要确保服务器...
在Flex上传文件的场景中,我们需要创建一个自定义的HttpHandler,处理POST请求,并接收从Flex客户端传来的文件数据。接收到文件后,可以将其保存到服务器的指定位置。 下载部分则相对简单,通常由Flex客户端发起...
本教程将重点讨论如何使用ASP.NET与Adobe Flex技术实现批量文件上传的功能。这两种技术的结合为开发人员提供了跨平台的灵活性,同时保证了前端的交互性和后端的强大处理能力。 首先,ASP.NET是微软公司推出的一种...
Flex上传文件夹插件是一种基于Adobe Flex技术的组件,它扩展了Flex应用程序的功能,使得用户能够轻松地上传整个文件夹,而不仅仅是个别文件。在传统的Web应用中,上传文件通常局限于单个文件的选择,而Flex上传...
总结,Flex 文件上传下载功能提供了灵活的接口,使得开发者能够轻松地实现客户端与服务器之间的文件交互。通过优化这些操作,可以有效地减少服务器资源的消耗,提升服务器的响应速度,从而提高用户体验。在实际应用...
本篇文章将详细讲解如何实现"flex文件上传下载,在线以pdf形式浏览文件"这一功能。 首先,让我们了解一下“flex”在这里的含义。Flex通常指的是Adobe Flex,一个用于构建富互联网应用(RIA)的开源框架。它基于...
接着,我们来看“Flex上传”。Flex是基于ActionScript 3.0的开放源码框架,用于构建富互联网应用程序(RIA)。它可以利用Flash Player运行,提供更丰富的用户界面和交互体验。"upload(批量).fla"是一个Flex项目文件...
Flex上传控件是一种基于Adobe Flex技术的用户界面组件,它允许用户在Web应用程序中上传文件。Flex是一个开源的开发框架,主要用于构建富互联网应用程序(RIA),它可以创建动态、交互式的Web应用,支持丰富的图形和...
本教程将探讨如何利用Flex作为前端客户端,通过WebService进行附件的上传和下载操作。 Flex是一款由Adobe开发的开源框架,主要用于创建交互式的、基于Flash Player或Adobe AIR的RIA。它提供了丰富的用户界面组件库...
本文将详细讲解如何使用Adobe Flex实现一个具有图片上传和预览功能的应用。 首先,Flex是一种开源的开发框架,基于ActionScript 3.0,用于构建富互联网应用程序(RIA)。在Flex中,我们可以利用Flash Player或Adobe...
Flex文件上传下载组件是基于Adobe Flex技术和Java后端开发的一款功能强大的交互式应用程序,它允许用户在Web浏览器中实现文件的便捷上传与下载。这款组件通常由前端的Flex客户端和后端的Java服务器端两部分组成,...
Flex文件上传下载是一种基于Adobe Flex技术的Web应用功能,它结合了Java后端服务来实现文件的上传和下载。在Flex前端,用户可以方便地通过图形界面选择文件,并通过Ajax方式与Java服务器进行异步通信,实现数据的...
### Flex文件的上传下载知识点详解 #### 一、引言 在现代Web应用程序开发中,文件的上传与下载是一项常见的需求。随着Flex框架的发展,这一功能的实现也变得越来越便捷。Flex是一种开源的软件框架,它允许开发者...
Flex图片上传实例是一个基于Flex3开发的前端应用,它提供了用户友好的图形界面,用于上传图片至服务器。这个实例特别适合那些需要在Web应用中集成图片上传功能的开发者。Flex是一种强大的富互联网应用程序(RIA)...