网上查找的有关于flex 文件上传的结果。
一、下面及个重要的类及方法(来自:http://mcs.sysu.edu.cn/user/longt/Article_2081)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. DiskFileUpload类
(1)setSizeMax(long sizeMax):
设置请求实体的最大限定值,防止客户端故意通过上传特大文件塞满服务器.
(2)setSizeThreshold(int sizeThreshold):
Apache文件上传组件在解析和处理上传数据中的每个字段内容时,需要临时保存解析出的数据。
(3)setRepositoryPath(String path):
设置setSizeThreshold方法中提到的临时文件的存放目录,这里使用绝对路径。
(4)parseRequest(HttpServerletRequest request)
ParseRequest(HttpServerletRequest request,int sizeThreshold,long sizeMax,String path)
是对HTTP请求消息进行解析的入口,需要Http请求必须是"multipart/form-data"类型.
该方法解析出Form表单中的每个字段的数据,并将它们分别包装成独立的FileItem对象加进一个List
类型的集合对象。
(5)setHeaderEncoding(String encode)
设置编码的方法,中文乱码处理需要用此方法.中文的编码一般用"gb2312"作为参数.
2. FileItem 类
(1) isFormField()
判断FileItem类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段。
普通表单字段 ---- return true;
文件表单字段 ---- return false;
(2) getName()
用于获取文件上传字段中的含路径的文件名。
需要注意的是用户如果没有通过文件表单传递文件,浏览器同样也会将文件字段和信息传递给服务器,
只是文件名和文件内容部分都为空,但这个表单字段仍然对应一个FileItem对象。此时getName()返回的是
一个空字符串"".
(3) getFieldName()
用于返回表单字段元素的name属性值.
(4) write(File file)
该方法用于将FileItem对象中保存的主题内容保存到某个指定的文件中.该方法也可以将普通表单字 段内容写入到一个文件中,但是它的主要用途是将上传的文件内容保存到本地文件系统中。
(5) getString()方法
用于将FileItem对象中保存的主体内容作为一个字符串返回。
(6)getContentType()方法
获得上传文件的类型,即文件的后缀。如果FileItem类对象对应的是普通表单字段,返回null.
(7)delete()方法
用来清空FileItem类对象中存放的主体内容,如果主体内容保存在临时文件中,delete方法将删除该 临时文件。
其余API,参考:http://commons.apache.org/fileupload/apidocs/index.html
二、相关代码
1、FileUploadDemo4.mxml
- <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- creationComplete="initApp();"
- xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
- <fx:Declarations>
- <!-- 将非可视元素(例如服务、值对象)放在此处 -->
- </fx:Declarations>
- <fx:Script>
- <![CDATA[
- import mx.controls.Alert;
- import mx.core.mx_internal;
- import mx.events.CloseEvent;
- //FileReference 类提供了在用户计算机和服务器之间上载和下载文件的方法
- private var file:FileReference = null;
- //定义过滤器
- private var imgFilter:FileFilter = new FileFilter("Images(*.jpg;*.png;*.gif;)", "*.jpg;*.png;*.gif;");
- private var txtFilter:FileFilter = new FileFilter("Files(*.pdf;*.txt;*.doc)", "*.pdf;*.txt;*.doc");
- private var allFilter:FileFilter = new FileFilter("All(*)", "*.*");
- private function initApp():void {
- try {
- //允许所标识的域中的 SWF 文件访问包含 allowDomain() 调用的 SWF 文件中的对象和变量。
- Security.allowDomain("*");
- file = new FileReference();
- //当用户从文件浏览对话框选择要上载或下载的文件时分派。
- file.addEventListener(Event.SELECT, selectEventHandle);
- //在文件上载或下载操作期间定期分派。
- file.addEventListener(ProgressEvent.PROGRESS, progressEventHandle);
- //当下载操作完成或上载操作生成 HTTP 状态代码 200 时分派。
- file.addEventListener(Event.COMPLETE, completeEventHandle);
- //当上载或下载失败时分派。
- file.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandle);
- } catch(err:ErrorEvent) {
- Alert.show("文件上传出错...");
- }
- }
- private function selectEventHandle(evt:Event):void {
- Alert.show("上传" + file.name + "总" + Math.round(file.size) + "字节。" , "确认书上传",
- Alert.YES|Alert.NO, null,
- processUpload);
- }
- private function progressEventHandle(evt:ProgressEvent):void {
- lblProgress.text = "已上传" + evt.bytesLoaded +"字节,总" + evt.bytesTotal + "字节。";
- var value:uint = evt.bytesLoaded / evt.bytesTotal * 100;
- bar.setProgress(value, 100);
- bar.label = "当前进度" + value + "%";
- }
- private function completeEventHandle(evt:Event):void {
- Alert.show("文件上传成功..");
- }
- private function processUpload(evt:CloseEvent):void {
- if(evt.detail == Alert.YES) {
- var reqest:URLRequest = new URLRequest("http://localhost:8080/FileUploadDemo4/fileUpload");
- try {
- file.upload(reqest);
- } catch(error:Error) {
- Alert.show("error...");
- }
- }
- }
- private function ioErrorEventHandle(evt:IOErrorEvent):void {
- Alert.show("ioerror: " + evt.toString());
- }
- private function upload():void {
- var acFilter:Array = new Array();
- acFilter.push(imgFilter);
- acFilter.push(txtFilter);
- acFilter.push(allFilter);
- file.browse(acFilter);
- }
- ]]>
- </fx:Script>
- <mx:VBox width="100%" height="100%" horizontalAlign="center" verticalAlign="middle">
- <mx:Label id="lblProgress" text="上传" />
- <mx:ProgressBar id="bar" mode="manual" labelPlacement="top" label="当前进度"
- direction="right" maximum="100" minimum="0"/>
- <mx:Button id="load" label="upLoad" click="upload();"/>
- </mx:VBox>
- </s:Application>
2、服务端的java代码
- package onlyfun.gray;
- import java.io.File;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Iterator;
- import java.util.List;
- 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;
- public class FileUpload extends HttpServlet {
- private String path = "d:/a/";
- private int maxSize = 100 * 1024 * 1024;
- public FileUpload() {
- // TODO Auto-generated constructor stub
- super();
- }
- @Override
- public void destroy() {
- // TODO Auto-generated method stub
- super.destroy();
- }
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- doPost(req, resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- //设置编码
- req.setCharacterEncoding("utf-8");
- resp.setContentType("text/html;charset=utf-8");
- // PrintWriter pw = resp.getWriter();
- //DiskFileItemFactory是创建FileItem对象的工厂
- DiskFileItemFactory factory = new DiskFileItemFactory();
- //设置内存缓冲区的大小,默认值为10K。
- factory.setSizeThreshold(4096);
- //ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装到一个FileItem对象中
- ServletFileUpload upload = new ServletFileUpload(factory);
- //setSizeMax(long sizeMax),设置上传文件总量的最大值。
- upload.setSizeMax(maxSize);
- try {
- // 解析保存在request中的数据并返回list集合
- List fileItems = upload.parseRequest(req);
- // 遍历list集合,取出每一个输入项的FileItem对象,并分别获取数据
- Iterator it = fileItems.iterator();
- while (it.hasNext()) {
- FileItem item = (FileItem) it.next();
- //判断FileItem类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段。
- // 普通表单字段 ---- return true;
- //文件表单字段 ---- return false;
- if (!item.isFormField()) {
- System.out.println("file name: " + item.getName());
- //该方法用于将FileItem对象中保存的主题内容保存到某个指定的文件中
- item.write(new File(path + item.getName()));
- }
- }
- } catch (FileUploadException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
3、web.xml中添加 servlet的关联映射
- <servlet>
- <servlet-name>fileUpload</servlet-name>
- <servlet-class>onlyfun.gray.FileUpload</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>fileUpload</servlet-name>
- <url-pattern>/fileUpload</url-pattern>
- </servlet-mapping>