背景:原来浏览器只要是能自己解析的,例如图片,txt等都自己解析之后显示在页面上,但是此处为了实现下载功能,设置头信息Content-disposition,让无论哪种文件格式都需要用户选择保存还是打开,都不会再是用浏览器自己打开了。
说明:此处只是基础测试文件下载的相应方法,实际应用中,文件名称等等不是写死的。
以下是情况一(需要下载的文件是英文名):
基本步骤:
1) 创建(获取)源对象。

String SrcPath=getServletContext().getRealPath(“想被用户下载的文件绝对路径(服务器端,可以不加项目名称,英文名)”);

2) 创建io流对象。此处采用字节输出输入流。

InputStream in=new FileInputStream(SrcPath);
OutputStream out=grtServletContext().getOutputStream();这里写代码片

3) 读写操作。此处是文件拷贝,并输入到浏览器页面。

//设置头信息,以备所有的文件都可以被弹框进行选择下载。
getServletContext().setHeader(“Content-Disposition”,”attachment;filename=文件名称(英文)”);
Byte[] buffer=new byte[1024];
Int len=0;
While(-1!=(len=in.read(buffer))){
        Out.write(buffer,0,len);
}

4) 关闭资源。

In.close();
//Out.close(); 此步骤可以省略,服务器自动帮我们操作,我们可以选择写或者不写

以下是情况二(文件名称是中文名称):因为当出现中文名称时候,弹框下载的提示内容会乱码,如下图所示:下图是在火狐浏览器进行测试的结果,对于中文部分直接选择不显示。

如何下载wsdl的java类 java web下载文件怎么写_java web


下图是ie浏览器出现的乱码情况。

如何下载wsdl的java类 java web下载文件怎么写_文件名_02


为了处理该种情况,对上述代码做了如下调整:(并且避免了文中写死文件名称,本文只针对IE浏览器,处理乱码情况)

基本步骤:

1) 创建(获取)源对象。

String SrcPath=getServletContext().getRealPath(“想被用户下载的文件绝对路径(服务器端,可以不加项目名称,英文名)”);
//截取文件路径中最后一个“/”后面的内容就是文件名。
Int index = srcPath.lastIndexOf(“\\”);
String filename=null;
If(-1!=index){
filename=srcPath.substring(index+1);
}
String agentHead=request.getHeader(“user-agent”);
if(agent.contains("MSIE")){
    filename = URLEncoder.encode(filename,"UTF-8");
    }

2) 创建io流对象。此处采用字节输出输入流。

If(null!=filename){
InputStream in=new FileInputStream(SrcPath);
OutputStream out=grtServletContext().getOutputStream();

3) 读写操作。此处是文件拷贝,并输入到浏览器页面。

//设置头信息,以备所有的文件都可以被弹框进行选择下载。
getServletContext().setHeader(“Content-Disposition”,”attachment;filename=”+filename);
Byte[] buffer=new byte[1024];
Int len=0;
While(-1!=(len=in.read(buffer))){
        Out.write(buffer,0,len);
}

4) 关闭资源。

In.close();
//Out.close();

}

执行结果如下所示:文件名称显示出来了。

如何下载wsdl的java类 java web下载文件怎么写_如何下载wsdl的java类_03