Webx系列之文件下载

在之前的文章中我们讲了下文件上传,今天我们来说一下文件的下载。总的来说,文件下载有下面三种方式来实现。下面我们来一一介绍一下。

Webx特有的方式

这种方式需要分两种情况来讲解。

情况一:

如果需要下载的页面没有处理类的。什么意思?比如说你发了一个请求,找到了你对应的页面,但是后台却没有响应的请求处理类来处理你的请求。对于这样的页面,你直接提交form表单就相当于是发了一次ajax请求,页面是不会进行刷新的。请看代码如下:

http://localhost:8080/MyWebxTest/down_load_file.htm

如果有这样的一个请求,但是后台没有这个请求的处理类,页面如下:

$page.setTitle("下载文件")
<html>
<head>
<script type="text/javascript" src="static/js/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
function doDownLoad(fileName){
	//$("input[name='fileName']").val(fileName);
	//$("#fileForm").submit();
	//$("#fileForm").action="file_load.do";
	$('#showValue').val('zhangsanlisi');
	$("#fileForm").submit();
}
</script>
</head>
<body>
	#*<form id="fileForm" method="post" action="file_load.do">
		<input type="hidden" name="fileName" />
	</form>
	*#
	<form id="fileForm" method="post" action="">
		<input type="hidden" name="fileName" />
		<input type="hidden" name="action" value="down_load_fileAction" />
	</form>
	<input id="showValue" />
	<table>
		<tr>
			<td>文件1</td>
			<td><input type="button" value="下载文件" onclick="doDownLoad('fileName1');" /></td>
		</tr>
		<tr>
			<td>文件2</td>
			<td><input type="button" value="下载文件" onclick="doDownLoad('fileName2');" /></td>
		</tr>
	</table>
</body>
</html>

如果点击了下载文件,会触发一个onclick事件,这个事件会提交一个表单,发送请求,发送的请求为:

http://localhost:8080/MyWebxTest/down_load_file.htm

这个时候你也许会有疑问,这个不就是访问这个页面的请求吗?没错,提交表单的时候发送的就是访问页面的请求,即是Referer。那么它是怎么找对应的处理类的呢?请注意这句话:<input type="hidden" name="action" value="down_load_fileAction"
/> Webx就是根据这个隐藏的action,来找他相应的处理类的。请注意的是处理类的路径,此类一定要放在

    <services:module-loader>
    	<ml-factories:class-modules>
    		<search-packages type="$1" packages="com.alibaba.webx.MyWebxTest.myWebX.module.*"/>
    	</ml-factories:class-modules>
    </services:module-loader>

<search-packages/>这个标签的包的下一级包action里。如图所示:

后台代码如下:

package com.alibaba.webx.MyWebxTest.myWebX.module.action;

import static com.alibaba.citrus.util.StringEscapeUtil.escapeURL;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.citrus.turbine.Context;

/**
 *
 * @author zkn 2016-06-28
 *
 */

public class DownLoadFileAction {

	@Autowired
	private HttpServletResponse response;

	public void execute(Context context){

		String fileName = "G:/qqq.txt";
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			String loadFileName = "\"" + escapeURL("zhangsan.txt") + "\"";;
			//重置输出流
			response.reset();
			//设置下载框
			response.setHeader("Content-disposition", "attachment; filename=" + loadFileName);
			//设置文件类型
			response.setContentType("text/plain;charset=UTF-8");

			br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
			bw = new BufferedWriter(new OutputStreamWriter(response.getOutputStream())) ;
			String lineStr = null;
			while((lineStr = br.readLine()) != null){
				bw.write(lineStr);
			}
			bw.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(br != null){
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(bw != null){
				try {
					bw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

情况二:

这种情况是下载页面有对应的处理类:

这种方式和上面那种方式唯一不同的地方在于,后台在处理完下载的逻辑之后,它会再次走一遍下载页面的处理类。什么意思呢?是这样的:还是上面的那个请求,

http://localhost:8080/MyWebxTest/down_load_file.htm

对于这个请求,后台有一个处理类为DownLoadFile.java。页面还是上面的那个页面,如果这个时候你点了下载文件,它会在处理完DownLoadFileAction.java这个类之后,再次处理DownLoadFile.java这个类.同样的它也不会刷新页面,但是有可能会出现隐藏的问题。不建议使用这种方式。

window.open的方法

这种方法呢,只需要在js里写一个window.open就可以了。请求方式最好是.do。这种方式就不过多介绍了,唯一需要注意的是,下载逻辑的后台处理类要放在screen下面,如图:

部分代码如下:

function doDownLoad(fileName){
	//$("input[name='fileName']").val(fileName);
	//$("#fileForm").submit();
	//$("#fileForm").action="file_load.do";
	$('#showValue').val('zhangsanlisi');
	$("#fileForm").submit();
	window.open('file_load.do');
}

传统的方式

什么是传统的方式呢?就是我们写一个form表单,在form的表单action里放入我们的请求。这种方式需要注意的是:form表单里不能有name=‘action’的input域。一定不能有。这种方式大家也都很熟悉了,也就没什么可说的了。代码如下:

$page.setTitle("下载文件")
<html>
<head>
<script type="text/javascript" src="static/js/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
alert('zhangsanlisi');
function doDownLoad(fileName){
	//$("input[name='fileName']").val(fileName);
	//$("#fileForm").submit();
	//$("#fileForm").action="file_load.do";
	$('#showValue').val('zhangsanlisi');
	$("#fileForm").submit();
	//window.open('file_load.do');
}
</script>
</head>
<body>
	<form id="fileForm" method="post" action="file_load.do">
		<input type="hidden" name="fileName" />
	</form>
	#*<form id="fileForm" method="post" action="">
		<input type="hidden" name="fileName" />
		<input type="hidden" name="action" value="down_load_fileAction" />
	</form>
	*#
	<input id="showValue" />
	<table>
		<tr>
			<td>文件1</td>
			<td><input type="button" value="下载文件" onclick="doDownLoad('fileName1');" /></td>
		</tr>
		<tr>
			<td>文件2</td>
			<td><input type="button" value="下载文件" onclick="doDownLoad('fileName2');" /></td>
		</tr>
	</table>
</body>
</html>

后台下载逻辑同上面的。

时间: 2024-08-04 14:09:58

Webx系列之文件下载的相关文章

C#开发BIMFACE系列10 服务端API之获取文件下载链接

通过BIMFACE控制台或者调用服务接口上传文件成功后,默认场景下需要下载该源文件,下载文件一般需要知道文件的下载链接即可.BIMACE平台提供了“获取文件下载链接”的服务接口.下面详细介绍其使用方法. 请求地址:GET https://file.bimface.com/download/url 说明:应用通过该接口获取文件的下载地址,然后下载文件.下载地址有效时间是5分钟. 参数: 请求 path(示例):https://file.bimface.com/download/url?fileId

C#线程系列讲座(3):线程池和文件下载服务器

如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一定程序上消耗服务器的资源.为此,一个最好的解决方法就是在服务器启动之前,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中获得线程对象,并处理请求.保存这些线程对象的结构就叫做线程池. 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不同,这些

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音

chromium浏览器开发系列第二篇:如何编译最新chromium源码

说一下为什么这么晚才发第二篇,上周和这周department的工作太多了,晚上都是十点半从公司出发,回家以后实在没有多余的精力去摸键盘了.所以请大家包涵! 上期回顾: chromium源码下载: 1.找个靠谱的vpn(我试过了,网上说的不用vpn拿代码的都不靠谱): 2.获取depot_tools,解压,设置环境变量; 3.gclient获取python和git,svn,设置环境变量: 4.fetch–nohooks chromium –nosvn=true 获取源码: 5.gclientsyn

chromium浏览器开发系列第二篇:如何编译最新chromium

说一下为什么这么晚才发第二篇,上周和这周department的工作太多了,晚上都是十点半从公司出发,回家以后实在没有多余的精力去摸键盘了.所以请大家包涵! 上期回顾: chromium源码下载: 1.找个靠谱的vpn(我试过了,网上说的不用vpn拿代码的都不靠谱): 2.获取depot_tools,解压,设置环境变量; 3.gclient获取python和git,svn,设置环境变量: 4.fetch–nohooks chromium –nosvn=true 获取源码: 5.gclientsyn

PNP8550(3.3V 直流蜂鸣器) - 原理图系列

一.截图 二.文件下载 sch20110901.7z PNP8550(3.3V 直流蜂鸣器) - 原理图系列,布布扣,bubuko.com

【转 iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束

原文网址:http://blog.csdn.net/pucker/article/details/41843511 上一篇文章<iOS 8界面自动布局系列-1>简要介绍了iOS界面布局方式的前世今生.本篇文章将详细介绍如何使用自动布局实现不同屏幕尺寸的适配. 添加自动布局约束(下文简称约束)有以下三种方式: 使用Xcode的Interface Builder界面设计器添加并设置约束 通过代码逐条添加约束 通过可视化格式语言VFL添加约束 本文将以一个简单的例子来演示如何使用这几种方式添加约束,

Spring MVC 4 文件下载实例(带源码)

[本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看.源码下载地址在文章末尾.] [翻译 by 明明如月 QQ 605283073] 原文地址:http://websystique.com/springmvc/spring-mvc-4-file-download-example/ 上一篇:Spring MVC 4 使用常规的fileupload上传文件(带源码) 本文将为你展示通过Spring MVC 4实现文件下载. 下载一个文件比较简单,主要包括下面几个步骤. 创建下

iOS开发系列--网络开发

iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 50097 阅读, 53 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession