有时,我们需要的是当客户端点击按钮后,自动下载文件,最简单的方法莫过于利用a标签写上文件的路径,直接下载,但有的时候我们可能会有一些复杂操作,因此需要在类似于servlet中进行处理,通知客户端下载,所用代码如下:
假设你有一个名为"download"的servlet,页面上的跳转我用的不是ajax(因为网上给出的解释是:ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。而文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,并不能执行。),代码为:
window.location.href='download';
该servlet中的doGet()或者doPost方法的最后加上(这是必须要有的):
String fileName = "文件名"+".后缀名";
response.setContentType("APPLICATION/OCTET-STREAM");
//设置文件名
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
接下来是关于文件内容的设置(二选一,添加在上面那段代码的后面),如果文件的内容是你在后台生成的String或者byte[]或者StringBuffer,可以用以下代码设置(利用StringBuffer的好处在于如果你的文件内容是由多部分凭借而成,利用append(String)方法可以在编辑文件时,看到文件呈现一行一行的效果,可读性增强):
//文件内容
StringBuffer sb = new StringBuffer();
String content = "文件内容";
sb.append(content);
ByteArrayOutputStream baos = null;
baos = new ByteArrayOutputStream();
baos.write(sb.toString().getBytes("UTF-8"));
byte[] data = baos.toByteArray();
response.setContentLength(data.length);
response.getOutputStream().write(data);
response.flushBuffer();
如果你已经有了一个现成的文件,可以用以下代码设置:
InputStream fis = new FileInputStream(path);
OutputStream outputStream = response.getOutputStream();
int i = -1;
byte[] b = new byte[1024];
while((i=fis.read(b)) != -1){
outputStream.write(b,0,i);
}
fis.close();
outputStream.close();
response.flushBuffer();
这样返回到前台后,客户端浏览器会自动进行下载(IE可能需要你点击确认以下),这样就完成文件下载功能了。
大家如果有什么疑惑,可以直接在下方评论或者私信博主,博主会尽量解答。