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>
    <br />
    <a href="<c:url value=‘/up/db.doc‘/>">下载doc</a>
    <br />
    <a href="<c:url value=‘/up/jingyesi.txt‘/>">下载txt</a>
    <br />
    <a href="<c:url value=‘/up/buystatus.xlsx‘/>">下载excel</a> 

这样能下载,但是任何人都能下载,你没法做一些控制,比如只有登录的用户才能下载,积分不够的人不能下载,而且,这样做是有问题的,如果下载的文件浏览器能直接解析,就不会以附件形式下载,浏览器会直接打开,如图片,txt文本,如果是在IE浏览器上,机器如果装了office,IE还会让你选择是打开文件还是下载文件:

一般人从来不这么干,都得通过Servlet来下载,这样你想咋控制你的下载条件就能控制了:

package com.lhy.upload;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 文件下载既可以是get请求也可以是post
 * @author Administrator
 *
 */
@WebServlet(name="DownServlet",urlPatterns="/DownServlet")
public class DownServlet extends HttpServlet{

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
  }

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8");
    String name = req.getParameter("name");//获取要下载的文件名
    //第一步:设置响应类型
    resp.setContentType("application/force-download");//应用程序强制下载
    //第二读取文件
    String path = getServletContext().getRealPath("/up/"+name);
    InputStream in = new FileInputStream(path);
    //设置响应头,对文件进行url编码
    name = URLEncoder.encode(name, "UTF-8");
    resp.setHeader("Content-Disposition", "attachment;filename="+name);
    resp.setContentLength(in.available());

    //第三步:老套路,开始copy
    OutputStream out = resp.getOutputStream();
    byte[] b = new byte[1024];
    int len = 0;
    while((len = in.read(b))!=-1){
      out.write(b, 0, len);
    }
    out.flush();
    out.close();
    in.close();
  }

}

注:resp.setContentType("application/force-download");//应用程序强制下载

以前也做过下载word,excel,网上说这个Content-Type设置这设置那的,记得当时就下载个excel、word还出这个那个问题,去还去百度修改这个Content-Type,不一样的文件类型设置的还不一样,统统的不需要,这里只设置成 application/force-download,很管事,不管啥文件,不管你是word,excel还是啥的,统统的老实的给我下载。

还有 resp.setHeader("Content-Disposition", "attachment;filename="+name);   这个 attachment 意思就是附件,就是说如果是浏览器能直接解析的文件,比如图片,你也老老实实以附件形式给我下载,别给我直接解析(IE除外,IE还会提示你让你选择打开还是下载)。

网上的一些说明:

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。

格式说明: 
content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )  

字段说明: 
Content-Disposition为属性名 
disposition-type是以什么方式下载,如attachment为以附件方式下载 
disposition-parm为默认保存时的文件名 
服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

字段说明: 
Content-Disposition为属性名 
disposition-type是以什么方式下载,如attachment为以附件方式下载 
disposition-parm为默认保存时的文件名 
服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

字段说明: 
Content-Disposition为属性名 
disposition-type是以什么方式下载,如attachment为以附件方式下载 
disposition-parm为默认保存时的文件名 
服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。

那么由上可知具体的例子:

Content-Disposition: attachment; filename="filename.xls" 
当然filename参数可以包含路径信息,但User-Agnet会忽略掉这些信息,只会把路径信息的最后一部分做为文件名。当你在响应类型为application/octet- stream情况下使用了这个头信息的话,那就意味着你不想直接显示内容,而是弹出一个"文件下载"的对话框,接下来就是由你来决定"打开"还是"保存" 了。

				



				
时间: 08-10

java文件下载的相关文章

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

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

java 文件下载

文件下载 设置一个超链接,不就可以下载可以了吗?确实如此,但是通过超链接下载文件,暴露了下载文件的真实地址,不利于对资源进行安全保护:而且,利用超链接下载文件,服务端的文件只能存放在Web应用程序所在的目录下. 利用程序编码实现下载,可以增加安全访问控制,对经过授权认证的用户提供下载:还可以从任意位置提供下载的数据,我们可以放到Web应用程序以外的目录中,也可以将文件保存到数据库中. 利用程序实现下载也非常简单,只需要按照如下的方式设置三个报头域就可以了: Content-Type:applic

Java文件下载文件名乱码

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

每天学习一个小功能:java文件下载

思路: 1.获取文件上传到upload文件夹下的文件名 2.将文件名处理成上传时的文件名并封装成集合给前端展示 3.前端根据提交的文件名再后台查找upload文件夹下查找并下载 代码: /**     * 1.获取文件上传到upload文件夹下的文件名 2.将文件名处理成上传时的文件名并封装成集合给前端展示     * @param request     * @param model     * @return     */        @RequestMapping("xiazai&quo

Java中创建访问HTTPS的自签名证书的方法

一.问题: 常常在用java访问https的请求时,总是出现SSL禁止的异常.这里给大家教下怎么创建与添加证书. 二.工具 : 1.创建一个目录 2.去Github上搜索InstallCert,然后随便下载一下来.比如:https://github.com/escline/InstallCert 把java文件下载到刚创建的这个目录中. 三.代码: 比如我要添加访问azure的几个管理的域名的https.. 就这样: 1.新建一个cert.bat文件. 2.bat中的内容如下: javac -d

【JavaWeb】参考大神重新写的上传下载

自学java,选择从简单的javaweb入手了. 读了网上某位大神的细致文章,了解后自己写了这篇上传下载的,加上了自己一部分的理解注释. 算是入门篇吧.大致完成了任务,比较粗糙. fileHanderServlet.java (文件上传处理) 1 package up.file.Servletfile; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 i

Java中都通用文件下载(ContentType、文件头、response、out四步骤)

Java中都通用文件下载(ContentType.文件头.response.out四步骤) 新浪微博:IT国子监(记得关注噢) http://weibo.com/itguozijian   我们就直接切入主题啦,文件下载只需要四步: 1.设置文件ContentType类型 2.设置文件头 3.通过response获取ServletOutputStream对象(out) 4.写到输出流(out)中 下载代码: 这里我使用的是SpringMVC,不过它在这里的唯一用途就是用来获取ServletCon

【Java EE 学习第22天 文件下载】【单线程下载】【单线程断点下载】【多线程下载】

一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-download"); (2)response.setContentLength(fis.available()); (3)response.setHeader("Content-Disposition","attachment;filename="+filename)

Java:使用HttpClient进行POST和GET请求以及文件下载

1.HttpClient 大家可以先看一下HttpClient的介绍,这篇博文写的还算不错:http://blog.csdn.net/wangpeng047/article/details/19624529 当然,详细的文档,你可以去官方网站查看和下载:http://hc.apache.org/httpclient-3.x/ 2.本博客简单介绍一下POST和GET以及文件下载的应用. 代码如下: package net.mobctrl; import java.io.ByteArrayOutpu