您的位置:首页 > 编程语言 > Java开发

利用Struts2 实现文件下载

2012-05-03 22:39 447 查看
需求如下:
进来项目中需要添加文件下载Excel功能;决定使用Struts2自带的文件下载功能

减轻工作量,提高工作效率,不需要再写常常的Header头了

要求不需要生成中间文件

Java Code

/*
* $Id: FileDownloadAction.java 496318 2007-01-15 13:58:24Z husted $
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0 *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.showcase.filedownload;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;

/**
* Demonstrates file resource download.
* Set filePath to the local file resource to download,
* relative to the application root ("/images/struts.gif").
*
*/
public class FileDownloadAction implements Action {
private String inputPath;
private String fileName;
private String contentType;
/**
* 输入流
*/
private InputStream inputStream;

public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public String getContentType() {
return contentType;
}

public void setContentType(String contentType) {
this.contentType = contentType;
}

public void setInputPath(String value) {
inputPath = value;
}

/**
* 如果设置了inputStream 则将inputStream输出到浏览器
* 如果通过inputPath获取文件,并将文件输出至浏览器;
* @return
* @throws Exception
*/
public InputStream getInputStream() throws Exception {
if(inputStream != null){
return inputStream;
}
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}

public String execute() throws Exception {
this.setContentType("application/vnd.ms-excel");
this.setFileName("wk.xls");
/**
* 生成Excls文件
*/
if(StringUtils.isBlank(inputPath)){
ByteArrayOutputStream output = new ByteArrayOutputStream();
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet 2");
// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow(0);
// Create a cell and put a value in it.
HSSFCell cell = row.createCell(0);
cell.setCellValue(1);
// Or do it on one line.
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue("This is a string");
row.createCell(3).setCellValue(true);
wb.write(output);
InputStream is = new ByteArrayInputStream(output.toByteArray());
this.setInputStream(is);
}
// return is;
return SUCCESS;
}

}

Struts.xml

<action name="download2" class="org.apache.struts2.showcase.filedownload.FileDownloadAction">
<result name="success" type="stream">
<param name="contentType">${contentType}</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">filename=${fileName}</param>
<param name="bufferSize">4096</param>
</result>
</action>

遗留问题:中文名称; Struts 如果是图片等等 会默认打开。稍后完善本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/851613
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: