Flex中的文件上传与下载

和传统的JSP一样,在flex中,有的时候也需要实现文件上传和下载的功能,但是在flex里文件的上传和下载的实现相对来说比较复杂,如何实现,请看下面。

    由于flex是一个比较新的技术,在研究的时候,还是按着JSP的方式去尝试,在开始之初,主要有以下几种思路:

    A、利用ftp的方式进行文件的上传和下载,需要利用flex的socket接口。

    B、利用webService的方式来进行文件的上传和下载

    C、利用flex+sevlet+fileupload组件实现文件的上传和下载

    在通过比较后,最后选择了第三种,用Flex+sevlet的方式来完成文件上传和下载的功能,理由如下(与上面的思路相对应):

    A、涉及到了流的操作,实现起来比较复杂,出现错误的几率比较高

    B、关于flex端的可参考的资料比较少,并且还需要启动webservice服务

    C、这个技术比较成熟,从flex2.0开始,在flex端已经可以引用FileReference类了,并且在java端有成熟的组件可以使用,所以最后考虑使用该种方法来处理。

一、文件的上传
    1、Flex端
        A、使用到的类介绍:
            FileReference 类提供了在用户计算机和服务器之间上载和下载文件的方法。 操作系统对话框会提示用户选择要上载的文件或用于下载的位置。它主要能实现一个文件的上传。
            FileReferenceList 类提供了让用户选择一个或多个要上载的文件的方法。 FileReferenceList 对象将用户磁盘上的一组本地文件(一个或多个文件)表示为 FileReference 对象的数组。
        B、使用 FileReferenceList 类 实现多文件上传:
            1) 将该类实例化:var myFileRef = new FileReferenceList();
            2) 调用 FileReferenceList.browse() 方法,该方法将打开一个对话框,让用户选择一个或多个要上载的文件:myFileRef.browse();
            3) 在成功调用 browse() 方法之后,使用 FileReference 对象数组来填充 FileReferenceList 对象的 fileList 属性。
                对 fileList 数组中的每个元素调用 FileReference.upload()

        代码如下:


    /** *//**
     * 执行上传操作
     * */   
    private function upLoadFiles():void
    {
        try
        {
            selectFileList.browse(new Array(imageFilter, textFilter));
            selectFileList.addEventListener(Event.SELECT, selectHandler1);
        }
        catch (error:Error)
        {
            Alert.show("文件选择出现错误,请选择正确的文件");
        }
    }
    /** *//**
     * 如果文件被选中,则执行该方法
     * */
    function selectHandler1(event:Event):void
    {
        var request:URLRequest = new URLRequest("FileUploadServlet");
        var upLoadFile:FileReference;
        var upLoadFileList:FileReferenceList = FileReferenceList(event.target);
        var selectedFileArray:Array = upLoadFileList.fileList;
        login =(testPress)(PopUpManager.createPopUp( this, testPress , true));
        for (var i:uint = 0; i < selectedFileArray.length; i++)
        {
            upLoadFile = FileReference(selectedFileArray[i]);
            upLoadFile.addEventListener(Event.COMPLETE, UpLoadcompleteHandler);
            upLoadFile.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            try
            {
                upLoadFile.upload(request);
            }
            catch (error:Error)
            {
                Alert.show(error.message.toString());
            }
        }
    }
    function UpLoadcompleteHandler(event:Event):void
    {
         var upLoadFiles:FileReference = FileReference(event.target);
         var fileNames = upLoadFiles.name;
         //Alert.show('文件'+fileNames+'上传成功')
         login.myLabels.text = '文件'+fileNames+'上传成功';
    }
     private function progressHandler(e:ProgressEvent):void
  {
    var proc: uint = e.bytesLoaded / e.bytesTotal * 100; 
    login.bar.setProgress(proc, 100); 
    login.bar.label= "当前进度: " + " " + proc + "%"; 
 }

testPress.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="528" height="236">
<mx:Script>
    <![CDATA[
        import mx.managers.PopUpManager;
        public function clickMe():void {
            PopUpManager.removePopUp(this);
        }
    ]]>
</mx:Script>
    <mx:ProgressBar id="bar" labelPlacement="bottom" themeColor="#F20D7A" 
minimum="0" visible="true" maximum="100" label="当前进度: 0%" 
direction="right" mode="manual" width="200" x="154" y="84"/> 
    <mx:Button x="221" y="135" label="关闭" click = "clickMe();"/>
    <mx:Label x="173" y="27" id="myLabels" width="157"/>

</mx:TitleWindow>

 

    2、JAVA端


     接受Flex端的请求,在JAVA端利用apache的fileupload类库实现上传功能。代码如下:

 

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.servlet.ServletContext;
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 FileUploadServlet extends HttpServlet
{

    // private String uploadPath = "D://upload//";
    private String path = "file_path.properties";
    private String skStr = "";
    private String uploadPath = "";
    private int maxPostSize = 1000 * 1024 * 1024;

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException,
            IOException
    {
        String filePathaa = this.getServletConfig().getServletContext().getRealPath("/");

        Properties p = loadProperties(path);

        uploadPath = p.getProperty("filepath");

        res.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");

        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024*20);

        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setSizeMax(maxPostSize);
        try
        {
            List fileItems = upload.parseRequest(req);
            Iterator iter = fileItems.iterator();
            while (iter.hasNext())
            {
                FileItem item = (FileItem) iter.next();
                if (!item.isFormField())
                {
                    String name = item.getName();

                    try
                    {
                        File skFile = new File(uploadPath + name);
                        if (skFile.exists())
                        {
                            skFile.delete();
                            item.write(new File(uploadPath + name));

                        }
                        else
                        {
                            item.write(new File(uploadPath + name));
                        }

                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        } catch (FileUploadException e)
        {
            e.printStackTrace();
        }

    }

    public Properties loadProperties(String path) throws IOException
    {

        InputStream in = this.getClass().getResourceAsStream(path);
        //

        Properties p = new Properties();

        p.load(in);
        in.close();
        return p;
    }

}


还要修正web.xml,添加如下内容

 

<!-- For file uploaded -->
   <servlet>
        <servlet-name>FileUploadServlet</servlet-name>
        <servlet-class>FileUploadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FileUploadServlet</servlet-name>
        <url-pattern>/FileUploadServlet</url-pattern>
    </servlet-mapping>


二、文件的下载
    

    调用的方法:private function downLoadFiles(urlAdd:String):void
    参数urlAdd就是用户的ip地址,如果使用本地的localhost就会产生安全沙箱问题,因此让用户自己输入自己的ip地址。这样就避免了安全沙箱的问题。如果是本机启动服务,访问地址,需要输入IP,不能用localhost来代替本机的IP地址,否则,还是会出现安全沙箱问题。

     FileReference.download() 方法提示用户提供文件的保存位置并开始从远程 URL 进行下载。直接加载请求路径下载,不需要后台的支持。代码如下:

 

import com.systex.flex.util.testPress;

import flash.net.FileReferenceList;

import mx.controls.Alert;
import mx.managers.PopUpManager;
    var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png");
    var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf, *.zip)", "*.txt; *.rtf; *.zip");
    var selectFileList:FileReferenceList = new FileReferenceList();
    var selectedFileArray:Array = new Array();
    var login:testPress = new testPress();
    var downloadURL:URLRequest;
    var DownLoadfile:FileReference; //这是要主要的地方
    //http://XX.XX.XX.XX:8080/upload/main.zip
    private function downLoadFiles(urlAdd:String):void
    {
        downloadURL = new URLRequest(urlAdd);
        DownLoadfile = new FileReference();
        configureListeners(DownLoadfile);
        DownLoadfile.download(downloadURL);
    }
     private function configureListeners(dispatcher:IEventDispatcher):void {
        dispatcher.addEventListener(Event.COMPLETE, completeHandler);

    }
   
    private function completeHandler(event:Event):void {
    mx.controls.Alert.show("文件下载成功");
    }


这里的是上面上传代码的上部分

附上测试的MXML

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    >
<mx:Script source="UpDownLoadFiles.as"/>

    <mx:Canvas width="100%" height="100%" x="10" y="170" fontSize="15">
    <mx:VBox width="100%" horizontalAlign="center">
    <mx:TextInput id="mytextInput"/>
    <mx:Button label="文件下载" click="downLoadFiles('http://'+mytextInput.text+':8080/downLoading/2MSN.rar');"/>
    <mx:Button label="上传文件" click="upLoadFiles();"/>
    </mx:VBox>
    </mx:Canvas>
</mx:Application>

内容概要:本文提出了一种基于非合作博弈理论的居民负荷分层调度模型,并结合双层鲸鱼优化算法(Two-level Whale Optimization Algorithm)进行高效求解,模型算法均通过Matlab代码实现。研究针对电力系统中居民侧用电负荷的复杂调度问题,引入非合作博弈机制刻画各用户之间的利益竞争关系,实现负荷的分层优化分配;同时设计双层优化架构,上层优化资源配置,下层模拟用户自主决策行为,提升了模型的实用性合理性。通过智能优化算法求解多层级、非凸非线性的博弈模型,有效提高了调度方案的收敛性全局寻优能力,适用于现代智能电网中的需求侧管理能源优化场景。; 适合人群:具备电力系统基础理论知识和Matlab编程能力,从事智能电网、能源优化调度、需求侧管理、博弈论应用等方向的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于居民区电力负荷的分层优化调度系统设计仿真分析;②为非合作博弈在多主体能源系统建模中的应用提供方法论支持;③利用双层鲸鱼算法解决具有嵌套结构的复杂双层优化问题,提升求解效率调度方案的可行性。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建逻辑算法实现流程,重点关注博弈模型的效用函数设计、纳什均衡求解思路以及双层优化结构的迭代机制,宜配合实际用电数据开展复现实验以验证模型有效性鲁棒性。
内容概要:本文围绕基于自适应神经模糊推理系统(ANFIS)智能控制器的可再生能源微电网功率管理系统展开研究,结合Simulink仿真实现,深入探讨了微电网中功率的智能调控经济机组组合调度问题。通过引入ANFIS控制器,有效应对风能、光伏等可再生能源出力的波动性不确定性,提升系统运行的稳定性电能质量。研究内容涵盖微电网多源协调控制策略、功率平衡管理、优化调度模型构建及仿真验证,实现了对分布式电源、储能系统和负荷的协同优化,兼顾经济性可靠性目标,并通过仿真平台验证了所提方法的有效性优越性。; 适合人群:具备电力系统、自动化或新能源相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网能量管理、智能控制、能源优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于高比例可再生能源接入场景下的微电网能量管理系统研发教学实践;②为实现微电网功率稳定控制经济高效运行提供先进的智能控制解决方案;③支撑高水平学术论文复现、科研课题攻关及实际工程项目的仿真验证方案优化。; 阅读建议:建议结合提供的Simulink模型相关代码进行动手实践,重点关注ANFIS控制器的设计流程、规则库构建参数调优方法,并通过传统PID或MPC控制策略的对比实验,深入理解其在动态响应鲁棒性方面的优势。同时可进一步拓展文中提出的优化调度逻辑,应用于多目标、多约束的复杂实际应用场景中。
内容概要:本文档聚焦于“直流电机双闭环控制Matlab仿真”,系统阐述了基于Matlab/Simulink平台实现直流电机双闭环控制系统(主要包括速度环电流环)的设计仿真全过程。通过构建直流电机的数学模型,结合PI控制器进行调控,实现对电机转速和电枢电流的高精度动态控制,验证控制策略的稳定性响应性能。文档详细介绍了仿真模型的搭建流程、关键参数的整定方法、系统动态波形的分析手段以及仿真结果的有效性验证,体现了经典自动控制理论在实际电机系统中的工程应用,是电机控制电力电子技术相结合的典型研究案例。; 适合人群:具备自动控制原理、电机拖动基础、电力电子技术和Matlab/Simulink仿真能力的电气工程、自动化、机电一体化等专业的本科生、研究生及从事电机驱动系统研发的工程技术人员。; 使用场景及目标:①作为高校课程设计或实验教学材料,帮助学生深入理解双闭环调速系统的工作机理工程实现;②服务于科研项目,为新型电机控制算法(如滑模、模糊PID等)的开发性能对比提供基础仿真验证平台;③作为工业界产品前期设计的仿真工具,用于评估不同控制策略在动态响应、抗干扰能力和稳态精度方面的可行性。; 阅读建议:建议读者在学习过程中紧密结合自动控制理论知识,亲手在Simulink环境中搭建完整的双闭环仿真模型,通过反复调整PI控制器的比例积分参数,观察并分析转速、电流的阶跃响应曲线,从而深刻理解反馈控制的本质、系统稳定性条件以及参数整定对动态性能的影响,进而掌握电机控制系统的设计精髓。
内容概要:本文研究了基于Benders分解输电网运营商(TSO)和配电网运营商(DSO)协调机制的不确定环境下输配电网双层优化模型,旨在提升高比例可再生能源接入背景下电网系统的协调性鲁棒性。模型上层以系统整体经济性为目标进行优化调度,下层采用Benders分解实现TSODSO之间的信息交互协同决策,通过引入割平面迭代机制保障求解的收敛性全局最优性。研究充分考虑新能源出力负荷需求的不确定性,构建了具有强适应性的双层优化框架,并基于Matlab完成了模型的编程实现仿真验证,有效解决了多主体、多层级、多不确定性因素耦合下的电力系统优化调度难题。; 适合人群:具备电力系统分析、运筹学优化理论基础,熟悉Matlab编程环境,从事智能电网、能源互联网、分布式能源集成、电力市场等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究高渗透率可再生能源条件下输配电网协同优化调度策略;②掌握Benders分解在电力系统双层优化建模中的应用方法实现技巧;③构建TSO-DSO多主体协调机制,实现跨层级电网资源的高效互动决策解耦;④提升对不确定性建模、分解算法设计及大规模优化问题求解能力。; 阅读建议:建议读者结合Matlab代码逐模块剖析模型构建流程,重点理解Benders割的生成逻辑、主从问题的信息传递机制及收敛判据设定,推荐在标准IEEE测试系统上复现实验以深入掌握模型特性算法性能。
内容概要:本文系统研究了基于灰狼优化算法(GWO)优化Elman神经网络的方法,并提供了完整的Matlab代码实现。研究重点在于利用灰狼优化算法强大的全局搜索能力,对Elman神经网络的关键参数进行智能优化,从而克服传统训练方法易陷入局部最优的缺陷,显著提升模型在时序预测非线性系统建模任务中的精度稳定性。文章详细阐述了Elman网络的动态反馈机制及其在处理时间序列数据方面的优势,构建了GWOElman相结合的混合预测框架,涵盖了从模型搭建、参数寻优、仿真测试到结果分析的全流程,特别适用于风电功率预测、电力负荷预测等具有强时变性和不确定性的工程应用场景。; 适合人群:具备一定Matlab编程能力和神经网络基础知识,从事智能优化算法、时间序列预测、电力系统分析或新能源出力预测等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握灰狼优化算法在神经网络超参数优化中的具体实施路径技术细节;②深入理解Elman递归神经网络群体智能优化算法融合的建模范式;③将其应用于风电、光伏等新能源发电功率预测及复杂动态系统的建模仿真,提升预测性能。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,重点关注GWO算法Elman网络的接口设计、适应度函数构建及参数优化迭代过程,可通过调整数据集或迁移至其他预测场景以深化理解和验证模型泛化能力。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值