当前位置: 代码迷 >> Web前端 >> Struts2使用注解方式实现文件上载
  详细解决方案

Struts2使用注解方式实现文件上载

热度:251   发布时间:2012-08-25 10:06:20.0
Struts2使用注解方式实现文件下载

1.采用xml方式的实现:

1)Action:

package frontview.download.action;

import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import model.FileInfo;

import org.apache.struts2.ServletActionContext;

import common.BaseAction;

import constant.Constant;
import frontview.download.service.IFrontDownloadService;

/**
 * 软件下载Action
 * 
 * @author heweina frontview.download.action.SoftwareDownloadAction.java
 *         2011-5-5 下午12:59:07
 */
public class SoftwareDownloadAction extends BaseAction {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private IFrontDownloadService frontDownloadService;

	//服务器端文件名
	private String fileName;
	
	//下载类型
	private String type;
	
	//浏览器类型
	private String brower;

	public IFrontDownloadService getFrontDownloadService() {
		return frontDownloadService;
	}

	public void setFrontDownloadService(
			IFrontDownloadService frontDownloadService) {
		this.frontDownloadService = frontDownloadService;
	}

	public String getFileName() {
		return fileName;
	}

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

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getBrower() {
		return brower;
	}

	public void setBrower(String brower) {
		this.brower = brower;
	}


	/**
	 * 获取下载文件的输入流
	 * @return 下载文件的输入流
	 * @throws Exception
	 */
	public InputStream getInputStream() throws Exception {
		//真实路径
	    String realPath = Constant.FILEFOLODER + fileName;
	    InputStream in = null;
	    try{
	    	in = ServletActionContext.getServletContext().getResourceAsStream(realPath);
	    }catch(Exception ex){
	    	
	    }
	    return in;
	}
	
	/**
	 * 获取下载文件显示名称(客户端名称)
	 * @return 下载文件显示名称
	 * @throws Exception
	 */
	public String getDownloadFileName() throws Exception {
		String fileID = request.getParameter("fileID");
		FileInfo fileInfo = frontDownloadService.getFileClientNameByID(fileID);
		String downFileName = fileInfo.getFileClientName()+"."+fileInfo.getFileSuffix();
		try{
			//IE浏览器
			if("IE".equals(brower)){
				downFileName = java.net.URLEncoder.encode(downFileName,"UTF-8");
			}else
			downFileName = new String(downFileName.getBytes(), "ISO8859-1");
		} catch (UnsupportedEncodingException  e) {

		}

		return downFileName;
	}
	
	@Override
	public String execute() throws Exception {
		String forward = null;

		//真实路径
	    String realPath = Constant.FILEFOLODER + fileName;
	    String filePath = ServletActionContext.getServletContext().getRealPath(realPath);

	    //文件不存在
	    if(!new File(filePath).exists()){     
	    	//全部列表下载
	    	if("page".equals(type)){
	    		forward = "fileNotFound";     
	    	}
	    	//首页前六条下载
	    	if("first".equals(type)){
	    		forward = ERROR;
	    	}
	    }else{
	    	forward = SUCCESS;
	    }
	    
	    return forward;
	}
}

?

2)struts.xml

<!-- 软件下载 -->
    	<action name="softwareDownload" class="frontview.download.action.SoftwareDownloadAction"> 	
			<param name="inputPath">/upload/unknown.doc</param>
			<!-- 初始文件名 -->
			<param name="fileName">unknown.doc</param>

            <result name="success" type="stream">
            
            	<!-- 指定下载文件的文件类型,设置输出的类型为二进制流 -->
                <param name="contentType">application/octet-stream;charset=ISO8859-1</param>
                <!-- 指定下载文件的文件位置 -->
                <param name="inputName">inputStream</param>
                <!-- 使用经过转码的文件名作为下载文件名,downloadFileName属性 对应action类中的方法 getDownloadFileName() -->
                <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
                <!-- 输出时缓冲区的大小 -->
                <param name="bufferSize">4096</param>
                
            </result>
            
            <result name="fileNotFound">/frontview/download/fileNotFind.jsp</result>
    		<result name="error">/frontview/download/tip.jsp</result>
        </action>

?

?2.注解方式:

1)Action:

/**
 * Copyright (C), 2011-2012, beijing ow Co., Ltd.
 * 文件名:     FileDownloadAction.java
 */
package com.ow.ovmweb.plugins.servicemanage.servicebrowse.action;

import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import javax.annotation.Resource;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.stereotype.Component;

import com.ow.core.common.BaseAction;
import com.ow.ovmweb.plugins.servicemanage.servicebrowse.model.ServiceQueryCondition;
import com.ow.ovmweb.plugins.servicemanage.servicebrowse.service.IServiceManageService;
import com.ow.tools.PropertiesTools;

/**   
 * 类描述:  文件下载的Action      
 * 修改历史:    
 * @author   heweina    
 * @version  1.0    
 * @date     2011-12-1  下午09:53:46
 * @description 
 * 其它:
 */
@Component
public class FileDownloadAction extends BaseAction {

	/**
	 */
	private static final long serialVersionUID = 1L;

	@Resource
	private IServiceManageService serviceManageService;
	
	private ServiceQueryCondition queryCondition;
	
	//当前页数
	private int curpager;
	
	//服务器端文件名
	private String fileName;
	
	private String orgID;
	
	private String serviceID;
	
	//浏览器类型
	private String brower;
	
	public IServiceManageService getServiceManageService() {
		return serviceManageService;
	}

	public void setServiceManageService(IServiceManageService serviceManageService) {
		this.serviceManageService = serviceManageService;
	}

	public String getFileName() {
		return fileName;
	}

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

	public String getBrower() {
		return brower;
	}

	public void setBrower(String brower) {
		this.brower = brower;
	}

	public ServiceQueryCondition getQueryCondition() {
		return queryCondition;
	}

	public void setQueryCondition(ServiceQueryCondition queryCondition) {
		this.queryCondition = queryCondition;
	}

	public int getCurpager() {
		return curpager;
	}

	public void setCurpager(int curpager) {
		this.curpager = curpager;
	}

	public String getOrgID() {
		return orgID;
	}

	public void setOrgID(String orgID) {
		this.orgID = orgID;
	}

	public String getServiceID() {
		return serviceID;
	}

	public void setServiceID(String serviceID) {
		this.serviceID = serviceID;
	}

	/**
	 * 获取下载文件的输入流
	 * @return 下载文件的输入流
	 * @throws Exception
	 */
	public InputStream getInputStream() throws Exception {
		//真实路径
	    String fileFolder = PropertiesTools.getValue("com/ow/ovmweb/global/constant.properties", "fileFolder");
	    String filePath = fileFolder+File.separator+fileName; 
	    InputStream in = null;
	    try{
	    	in = ServletActionContext.getServletContext().getResourceAsStream(filePath);
	    }catch(Exception ex){
	    }
	    return in;
	}
	
	/**
	 * 获取下载文件显示名称(客户端名称)
	 * @return 下载文件显示名称
	 * @throws Exception
	 */
	public String getDownloadFileName() throws Exception {
	
		String downFileName = fileName;
		try{
			//IE浏览器
			if("IE".equals(brower)){
				downFileName = java.net.URLEncoder.encode(downFileName,"UTF-8");
			}else
			downFileName = new String(downFileName.getBytes(), "ISO8859-1");
		} catch (UnsupportedEncodingException  e) {

		}

		return downFileName;
	}
	
	@Override
	@Action(value="fileDownload",results={
			@Result(name=SUCCESS, type="stream", params={"contentType","application/octet-stream;charset=ISO8859-1","inputName","inputStream",
					"contentDisposition","attachment;filename=\"${downloadFileName}\"","bufferSize","4096"}),
			@Result(name="fileNotFound", location="/pages/servicemanage/servicebrowse/tip.jsp")
	})
	public String execute() throws Exception {
		String forward = null;

		String fileFolder = PropertiesTools.getValue("com/ow/ovmweb/global/constant.properties", "fileFolder");
	    String filePath = ServletActionContext.getServletContext().getRealPath("")+File.separator+fileFolder+File.separator+fileName; 
	    
	    //文件不存在
	    if(!new File(filePath).exists()){     	   
	    	forward = "fileNotFound";         	
	    }else{
	    	forward = SUCCESS;
	    }
	    
	    return forward;
	}
}

?注意:执行过程中可能会出现如下错误:

?不是inputName配置的方法找不到,而是其中的getInputStream()方法 中的代码出现了异常,可以通过 System.out.println(in);

打印出输入流,如果为NULL的话,说明realPath路径正确,否则是这个流的realPath路径错误。

  相关解决方案