java 文件下载

文件下载

  设置一个超链接,不就可以下载可以了吗?确实如此,但是通过超链接下载文件,暴露了下载文件的真实地址,不利于对资源进行安全保护;而且,利用超链接下载文件,服务端的文件只能存放在Web应用程序所在的目录下。

  利用程序编码实现下载,可以增加安全访问控制,对经过授权认证的用户提供下载;还可以从任意位置提供下载的数据,我们可以放到Web应用程序以外的目录中,也可以将文件保存到数据库中。

  利用程序实现下载也非常简单,只需要按照如下的方式设置三个报头域就可以了:

Content-Type:application/x-msdownload
Content-Disposition:attachment;filename=downloadfile
Content-Length:filesize

  1、利用程序实现下载:

public class DownAction extends ActionSupport implements ServletResponseAware{

    @Override
    public String execute() throws Exception {
        String path = "E:\\books\\[Struts.2深入详解].孙鑫.扫描版.pdf";
        download(path,response);
        return null;
    }

    public void download(String path,HttpServletResponse response){
        try {

            // 根据path获取指定文件
            File file = new File(path);
            // 取得文件名称
            String  filename = file.getName();
            // 设置response的Header
            response.setContentType("application/x-msdownload;charset=UTF-8");
            //设置要显示在保存窗口的文件名,如果文件名中有中文的话,则要设置字符集,否则会出现乱码。
            response.addHeader("Content-Disposition","attachment; filename="+new String(filename.getBytes("gbk"),"iso-8859-1"));
            response.addHeader("Content-Length",""+file.length());
            // 以流的方式下载文件
            InputStream fis = new FileInputStream(file);
            OutputStream client = response.getOutputStream();
            int length;
            byte[] buffer = new byte[1024];
            while((length = fis.read(buffer)) > 0){
                // 将数据写到客户端内存
                client.write(buffer,0,length);
            }
            client.flush();
            client.close();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }

    private HttpServletResponse response;
}

2、利用Struts2下载文件

public class StrutsDownAction extends ActionSupport implements ServletResponseAware{

    private String fileName;

    private InputStream is;

    public InputStream getInputStream(){
        return is;
    }

    public String getFileName() {
        try {       // 解决中文乱码
            response.setHeader("charset","ISO8859-1");
            return new String(this.fileName.getBytes(),"ISO8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return "获取文件名出现了错误!";
        }
    }

    @Override
    public String execute() throws Exception {
        File file = new File("E:\\books\\[Struts.2深入详解].孙鑫.扫描版.pdf");
        fileName = file.getName();
        is = new FileInputStream(file);
        return SUCCESS;
    }

    @Override
    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }

    private HttpServletResponse response;
}

struts.xml配置文件

<action name="sdownload" class="org.zsm.action.StrutsDownAction">
            <result name="success" type="stream">
                <param name="contentType">application/x-msdownload;charset=ISO8859-1</param>
                <param name="inputStream">inputStream</param>
                <param name="contentDisposition">filename=${fileName}</param>
                <param name="bufferSize">2048</param>
            </result>
        </action>
时间: 2024-10-12 12:16:46

java 文件下载的相关文章

JAVA文件下载功能问题解决日志

今天给报告系统做了个下载功能,遇到了挺多问题,通过查资料一一解决了. 1.首先遇到的问题是:java后台的输出流输出之后,没有任何报错,浏览器端不弹出保存文件的对话框,原本是ajax请求到后台的controller方法中添加了下载的方法,type和async两个参数的四种组合都不行,弃用ajax,用window.location.href='file/download?path='+file;重新发一个新的下载请求之后,保存对话框终于弹出. 2.弹出之后,发现文件名乱码,后台的解决方案代码如下:

Java文件下载的几种方式

   本文主要是讲述Java文件下载的几种方式,更多Java技术知识,请登陆疯狂软件教育官网. publicHttpServletResponsedownload(Stringpath,HttpServletResponseresponse){ try{ //path是指欲下载的文件的路径. Filefile=newFile(path); //取得文件名. Stringfilename=file.getName(); //取得文件的后缀名. Stringext=filename.substrin

关于java文件下载文件名乱码问题解决方案

关于java文件下载文件名乱码问题解决方案 做为一名程序员,大家应该都遇到过乱码的问题吧!这篇文章是自己解决关于关于java文件下载文件名乱码问题的处理: String fileName = "下载的文件名"; String userAgent = request.getHeader("User-Agent"); //针对IE或者以IE为内核的浏览器: if (userAgent.contains("MSIE")||userAgent.conta

java文件下载

文件下载,可以是post请求,也可以是get请求. 新建web项目,在WebRoot下建up目录存放上传的文件: 最简单的但是实际不会这样做的下载方式,直接用a标签指向文件目录,就能下载: <a href="<c:url value='/up/a.jpg'/>">下载jpg</a> <br /> <a href="<c:url value='/up/cos.jar'/>">下载jar</a

Java文件下载文件名乱码

文件下载文件名乱码主要是没有对文件名进行编码,这里适用的浏览器主要包括(IE,火狐,谷歌,360) 代码如下 //火狐浏览器 if(ServletActionContext.getRequest().getHeader("USER-AGENT").toLowerCase().indexOf("firefox") >0){ return new String(文件名.getBytes(), Const.CHARSET_ISO8859_1); } //其他浏览器

java文件下载中中文为空格的解决

在文件下载中设置的addheader中将filename设置为 filename=\""+ URLEncoder.encode(downloadFile.getName(), "UTF-8")+"\" 最后的形式为 response.addHeader("Content-Disposition", "attachment; filename=\""+ URLEncoder.encode(downl

SpringMvc之java文件下载

1.页面的一个超链接,链接到controller <a href="<%=path%>/download">点击下载文件</a> 2.controller中的代码: @RequestMapping("/download") @ResponseBody public void downLoadExcelModel(HttpServletRequest request,HttpServletResponse response) thr

java文件下载 rest

/** * 返回文件二进制 * */ @GET @Path("/excel") @Produces("application/vnd.ms-excel; charset=UTF-8") @ModuleSecurityAuth(moduleId=ModuleId.MONITOR_REPORT ,privilegeOperation=PrivilegeOperation.READ) public Response download(final @QueryParam(&

java文件下载(有非常详细的注释).

话不多说,直接贴代码: //文件下载 public static String downloadFile(File file) { HttpServletResponse response = ServletActionContext.getResponse(); FileInputStream fis = null; BufferedInputStream buff = null; OutputStream out = null; try { /* 如果文件存在 */ if (file.exi