Java文件下载的几种方式
????
public
?HttpServletResponse?download(String?path,?HttpServletResponse?response)?{
????????
try
?{
????????????
//
?path是指欲下载的文件的路径。
????????????File?file?
=
?
new
?File(path);
????????????
//
?取得文件名。
????????????String?filename?
=
?file.getName();
????????????
//
?取得文件的后缀名。
????????????String?ext?
=
?filename.substring(filename.lastIndexOf(
"
.
"
)?
+
?
1
).toUpperCase();
????????????
//
?以流的形式下载文件。
????????????InputStream?fis?
=
?
new
?BufferedInputStream(
new
?FileInputStream(path));
????????????
byte
[]?buffer?
=
?
new
?
byte
[fis.available()];
????????????fis.read(buffer);
????????????fis.close();
????????????
//
?清空response
????????????response.reset();
????????????
//
?设置response的Header
????????????response.addHeader(
"
Content-Disposition
"
,?
"
attachment;filename=
"
?
+
?
new
?String(filename.getBytes()));
????????????response.addHeader(
"
Content-Length
"
,?
""
?
+
?file.length());
????????????OutputStream?toClient?
=
?
new
?BufferedOutputStream(response.getOutputStream());
????????????response.setContentType(
"
application/octet-stream
"
);
????????????toClient.write(buffer);
????????????toClient.flush();
????????????toClient.close();
????????}?
catch
?(IOException?ex)?{
????????????ex.printStackTrace();
????????}
????????
return
?response;
????}
????
public
?
void
?downloadLocal(HttpServletResponse?response)?
throws
?FileNotFoundException?{
????????
//
?下载本地文件
????????String?fileName?
=
?
"
Operator.doc
"
.toString();?
//
?文件的默认保存名
????????
//
?读到流中
????????InputStream?inStream?
=
?
new
?FileInputStream(
"
c:/Operator.doc
"
);
//
?文件的存放路径
????????
//
?设置输出的格式
????????response.reset();
????????response.setContentType(
"
bin
"
);
????????response.addHeader(
"
Content-Disposition
"
,?
"
attachment;?filename=\
""
?+?fileName?+?
"
\
""
);
????????
//
?循环取出流中的数据
????????
byte
[]?b?
=
?
new
?
byte
[
100
];
????????
int
?len;
????????
try
?{
????????????
while
?((len?
=
?inStream.read(b))?
>
?
0
)
????????????????response.getOutputStream().write(b,?
0
,?len);
????????????inStream.close();
????????}?
catch
?(IOException?e)?{
????????????e.printStackTrace();
????????}
????}
????
public
?
void
?downloadNet(HttpServletResponse?response)?
throws
?MalformedURLException?{
????????
//
?下载网络文件
????????
int
?bytesum?
=
?
0
;
????????
int
?byteread?
=
?
0
;
????????URL?url?
=
?
new
?URL(
"
windine.blogdriver.com/logo.gif
"
);
????????
try
?{
????????????URLConnection?conn?
=
?url.openConnection();
????????????InputStream?inStream?
=
?conn.getInputStream();
????????????FileOutputStream?fs?
=
?
new
?FileOutputStream(
"
c:/abc.gif
"
);
????????????
byte
[]?buffer?
=
?
new
?
byte
[
1204
];
????????????
int
?length;
????????????
while
?((byteread?
=
?inStream.read(buffer))?
!=
?
-
1
)?{
????????????????bytesum?
+=
?byteread;
????????????????System.out.println(bytesum);
????????????????fs.write(buffer,?
0
,?byteread);
????????????}
????????}?
catch
?(FileNotFoundException?e)?{
????????????e.printStackTrace();
????????}?
catch
?(IOException?e)?{
????????????e.printStackTrace();
????????}
????}
????????File?f? = ? new ?File(filePath);
???????? if ?( ! f.exists())?{
????????????response.sendError( 404 ,? " File?not?found! " );
???????????? return ;
????????}
????????BufferedInputStream?br? = ? new ?BufferedInputStream( new ?FileInputStream(f));
???????? byte []?buf? = ? new ? byte [ 1024 ];
???????? int ?len? = ? 0 ;
????????response.reset();? // ?非常重要
???????? if ?(isOnLine)?{? // ?在线打开方式
????????????URL?u? = ? new ?URL( " file:/// " ? + ?filePath);
????????????response.setContentType(u.openConnection().getContentType());
????????????response.setHeader( " Content-Disposition " ,? " inline;?filename= " ? + ?f.getName());
???????????? // ?文件名应该编码成UTF-8
????????}? else ?{? // ?纯下载方式
????????????response.setContentType( " application/x-msdownload " );
????????????response.setHeader( " Content-Disposition " ,? " attachment;?filename= " ? + ?f.getName());
????????}
????????OutputStream?out? = ?response.getOutputStream();
???????? while ?((len? = ?br.read(buf))? > ? 0 )
????????????out.write(buf,? 0 ,?len);
????????br.close();
????????out.close();
????}