zoukankan      html  css  js  c++  java
  • javaweb文件下载

    最近搞了一下struts文件上传下载了,一个是通过struts自带的类实现的下载方法,一个是通用的下载方法:

    struts实现:

    FileDownloadAction.java
    package com.fro.action;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.ServletActionContext;
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class FileDownloadAction extends ActionSupport implements ServletRequestAware, ServletResponseAware {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    
    	private HttpServletRequest request;
    	private HttpServletResponse response;
    	private int number;
    	private String fileName;
    	private String contentType;
    
    	public int getNumber() {
    		return number;
    	}
    
    	public void setNumber(int number) {
    		this.number = number;
    	}
    
    	public String getFileName() {
    		return fileName;
    	}
    
    	public void setFileName(String fileName) throws UnsupportedEncodingException {
    		this.fileName = fileName;
    	}
    
    	public HttpServletResponse getResponse() {
    		return response;
    	}
    
    	public void setResponse(HttpServletResponse response) {
    		this.response = response;
    	}
    
    	public String getContentType() {
    		return contentType;
    	}
    
    	public void setContentType(String contentType) {
    		this.contentType = contentType;
    	}
    
    	// 返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流
    	public InputStream getDownloadFile() {
    		try {
    			if (1 == number) {
    				this.fileName = "使用说明书.doc";
    				// 解决文件乱码问题
    				if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
    					fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
    				} else {
    					fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
    				}
    				this.contentType = "application/msword";
    				// 获取资源路径
    				return ServletActionContext.getServletContext().getResourceAsStream("files/使用说明书.doc");
    			} else if (2 == number) {
    				this.fileName = "ModbusV2.0_down.mp4";
    				// 解决文件乱码问题
    				if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
    					fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
    				} else {
    					fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
    				}
    				this.contentType = "video/mp4";
    				// 获取资源路径
    				return ServletActionContext.getServletContext().getResourceAsStream("mediaelement/media/ModbusV2.0_down.mp4");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    		return null;
    	}
    
    	@Override
    	public String execute() throws Exception {
    
    		return SUCCESS;
    	}
    
    	@Override
    	public void setServletResponse(HttpServletResponse response) {
    		this.response = response;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    }
    

    struts.xml文件配置:

        <action name="FileDownload" class="com.fro.action.FileDownloadAction">
                <result name="success" type="stream">
                    <param name="contentType">${contentType}</param>
                    <param name="contentDisposition">attachment;fileName="${fileName}"</param>
                    <param name="inputName">downloadFile</param>
                    <param name="bufferSize">1024</param>
                </result>
            </action>

    下面是通用的下载方法,不过我这里还是用struts实现的:

    DdownloadAction.java
    package com.fro.action;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class DdownloadAction extends ActionSupport implements ServletRequestAware, ServletResponseAware {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	
    	private String contentType;// 文件类型
    	private String filename;// 指定下载后的文件名
    	private HttpServletRequest request;
    	private HttpServletResponse response;
    
    
    	public InputStream getTargetFile() throws Exception {
    		
    		String realPath = request.getSession().getServletContext().getRealPath("/");
    		String filePath = realPath + "/mediaelement/media/ModbusV2.0_down.mp4";
    		System.out.println("filePath:" + filePath);
    		File file = new File(filePath);
    		
    		response.setContentType("application/octet-stream; charset=UTF-8");
    		String fileName = "ModbusV2.0_down.mp4";
    		// 解决中文文件名乱码问题
    		if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
    			fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); // firefox浏览器
    		} else {
    			fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
    		}
    		response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
    		
    		InputStream in = new FileInputStream(file);
    		OutputStream out = response.getOutputStream();
    		byte[] data = new byte[1024];
    		int len = 0;
    		while ((len = in.read(data)) != -1) {
    			out.write(data, 0, len);
    		}
    		out.flush();
    		return null;
    	}
    
    	public String execute() throws Exception {
    		
    		return SUCCESS;
    
    	}
    
    	public String getContentType() {
    		return contentType;
    	}
    
    	public void setContentType(String contentType) {
    		this.contentType = contentType;
    	}
    
    	public String getFilename() {
    		return filename;
    	}
    
    	public void setFilename(String filename) {
    		this.filename = filename;
    	}
    
    	public HttpServletRequest getRequest() {
    		return request;
    	}
    
    	public void setRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    
    	public HttpServletResponse getResponse() {
    		return response;
    	}
    
    	public void setResponse(HttpServletResponse response) {
    		this.response = response;
    	}
    
    	@Override
    	public void setServletResponse(HttpServletResponse response) {
    		response.setCharacterEncoding("utf-8");
    		this.response = response;
    	}
    
    	@Override
    	public void setServletRequest(HttpServletRequest request) {
    		this.request = request;
    	}
    }
    

    struts.xml文件配置:

        <action name="download_*" class="com.fro.action.DdownloadAction" method="{1}">
                <result name="success" type="redirect">/index.jsp</result>
            </action>

    下面是我的jsp文件:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>My JSP 'filedownload.jsp' starting page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!-- 
            <link rel="stylesheet" type="text/css" href="styles.css"> 
            -->
    
    </head>
    
    <body>
    
    	<h2>文件下载内容:</h2>
    	<br /> 使用说明书.doc:
    	<a href="FileDownload.action?number=1">点击下载</a>
    	<br /> ModbusV2.0_down.mp4:
    	<a href="FileDownload.action?number=2">点击下载</a>
    	<br /> 使用说明书.doc:
    	<a href="download_getTargetFile.action">点击下载</a>
    	<br /> 使用说明书.doc:
    	<a href="file_download.action">点击下载</a>
    
    
    </body>
    </html>
    

     其中解决了下载文件文件名中文乱码问题。

    其他方式:

     //判断是否为火狐浏览器
          	String Agent = request.getHeader("User-Agent");
          	StringTokenizer st = new StringTokenizer(Agent,";");
          	st.nextToken();
          	//得到用户的浏览器类型
          	String userbrowser = st.nextToken();
          	//LOGGER.debug(userbrowser+"浏览器---------------------------");
          	//LOGGER.debug(userbrowser.trim().toLowerCase()+"浏览器类型---------------------------");
          	//LOGGER.debug(userbrowser.trim().toLowerCase().contains("wow64)")+"是否为火狐浏览器----------------------------");
          	if(userbrowser.toLowerCase().contains("wow64")){
          		response.setHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes("GB2312"),"ISO-8859-1"));
          	}else{
          		response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realName, "UTF-8"));
          	}
    
  • 相关阅读:
    web网络编程
    C++ 多线程*****(看书补充)
    C++信号处理
    预指令
    C++模板*******
    C++ 命名空间
    动态存储
    异常处理**********
    私钥、秘钥详解
    Pod控制器应用进阶
  • 原文地址:https://www.cnblogs.com/guxingzhe/p/4863774.html
Copyright © 2011-2022 走看看