Flex+Struts2结合实现文件下载

4 篇文章 0 订阅

前阵子由于工作的需要,在项目里写了一个用Flex+Struts2实现的文件下载功能。现在有空整理下~


一.首先是Flex部分的代码(解释下:在点击“下载”按钮后就可以进行下载)

protected function button1_clickHandler(event:MouseEvent):void
	{
		var p:URLVariables = new URLVariables();
				

		p.fileName = list2.selectedItem;
	        if(p.fileName==undefined){
			
			Alert.show("请选择要下载的文件!", "提示");
		}else{
			var filename = p.fileName;
					
			p.path = path;
			var request:URLRequest;
			var file:FileReference; 
					
			request = new URLRequest(HTTPUtilConfig.HTTP_URL+"/CognosRF/download1_down"+HTTPUtilConfig.HTTP_URL_SUFFIX);
			request.data = p;
			file = new FileReference();
			configureListeners(file);
			file.download(request,filename);
					
		      }
				
	  }
	  private function configureListeners(dispatcher:IEventDispatcher):void{
		dispatcher.addEventListener(Event.COMPLETE, completeHandler);
		dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
	 }
			
	 private function completeHandler(event:Event):void{
		Alert.show("文件下载成功!", "提示");
	}
			
	private function ioErrorHandler(event:IOErrorEvent):void{
		Alert.show("文件下载失败!\n" + event.toString(), "提示");
	}
1.在Flex中,文件的上传下载都是依靠flash.net.FileReference类实现的。FileReference类提供了在用户计算机和服务器之间上传和下载文件的方法。利用该类的方法,可以在上传下载前打开操作系统对话框,提示用户选择要上传的文件或用于下载的位置。而后通过HTTP协议上传下载文件。

2.FileReference.download()
下载指定的文件。该方法支持下载任何格式的文件。但是在Flash Player中可以下载文件最大为100M。该方法包含两个参数:服务器端脚本URL和默认的文件名。默认文件名为空时,下载后仍采用文件原来的文件名。(最好还是把文件名参数加上,我当时没加就出错了,下载后的名字不对)

3.在打开对话框,上传下载文件中都可以触发相应的事件。常用的事件如下所示:

❑cancel:当上传或者下载被取消时触发该事件。该事件类型为:flash.events.Event.CANCEL。

❑complete:当下载结束,即Flash Player接收到HTTP状态码200时触发该事件。
            该事件的类型为flash.events.Event.COMPLETE。

❑ioError:当上传或下载失败时触发该事件。该事件的型为:flash.events.IOErrorEvent.IO_ERROR。

❑open:当打开选择文件对话框是时触发该事件。该事件的类型为:flash.events.Event.OPEN。

❑progress:上传或者下载的过程中触发该事件。该事件通常与进度条控件(ProgressBar Control)结合
           在一起显示当前的上传或者下载的进度。该事件的类型为:flash.events.ProgressEvent.PROGRESS。

❑select:当选中要上传或者下载的时候触发该事件。该事件的类型为flash.events.Event.SELECT。

❑uploadCompleteData:该事件与Complete不同,上传时,服务端接受完数据返回成功消息时,才能触发该事件。
                     该事件的类型为flash.events.DataEvent.UPLOAD_COMPLETE_DATA。

在上述上传下载的事件发生时,需要使用addEventListener()方法为事件添加事件侦听器。

4.注意FileReference只能上传下载一个文件,如果要以此上传下载多个文件可以使用FileReferenceList类。
调用FileReferenceList.browse()选中多个文件时,创建了一个FileReference对象数组。
该类的属性、方法和事件和FileReference类基本一致,这里不再详述。

二.java+struts2部分

先看java代码

public class DownloadAction extends BaseAction{
    
	private String fileName;
    private String path;
    
	
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	
	public String getFileName() {
		return fileName;
	}
	
    public void setPath(String path) {
		this.path = path;
	}
	
	//返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流  

	public InputStream getInputStream() {
        try {
			return new FileInputStream(path+"\\"+fileName);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	public String down(){
		return "success";
	}

}

Struts2部分——在struts.xml文件中配置相关信息



<package name="CognosRF" namespace="CognosRF" extends="struts">
    <action name="*_*" class="{1}" method="{2}">
	<result name="success" type="stream" >
            <param name="contentType">application/octet-stream</param>
            <param name="inputName">inputStream</param>
            <param name="contentDisposition">attachment;filename="${fileName}"</param>
            <param name="bufferSize">4096</param>
        </result>
    </action>
</package>

1.

结果类型必须要写成 type="stream"  ,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult。


2.

<param name="inputName">inputStream</param>
中的inputStream对应的是java的DownloadAction类里的public InputStream getInputStream()。

inputName 
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法

3.

1)  <param name="contentDisposition">attachment;fileName="${fileName}"</param>;

contentDisposition 

文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。

2)  attachment :下载时会打开下载框;

3) fileName="${fileName}" :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字
weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值